我有以下的SQL表。Linq2Sql如何编写外部连接查询?
ImportantMessages
impID
消息
ImportantMessageUsers
imuID
imuUserID
imuImpID
我想编写一个Linq2Sql查询,以便它返回ImportantMessagesUsers中没有记录的重要消息 中的任何行。
Matchiing字段 impID ----- imuImpID
假设的6
我有以下的SQL表。Linq2Sql如何编写外部连接查询?
ImportantMessages
impID
消息
ImportantMessageUsers
imuID
imuUserID
imuImpID
我想编写一个Linq2Sql查询,以便它返回ImportantMessagesUsers中没有记录的重要消息 中的任何行。
Matchiing字段 impID ----- imuImpID
假设的6
imuUserID这将是一样简单
var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Count() == 0);
编辑
我想我已经很好地理解了这个问题,您必须从没有任何ro的重要消息表中获取所有消息w位于ImportantMessageUsers表中,该表与外键连接ImportantMessagesUsers.imuImpID = ImportantMessages.impID。
请检查这些表之间是否有外键,然后从Linq上下文设计器中删除这些表并再次添加它们 - 外键应该在它们之间可见,从而创建诸如ImportantMessages.ImportantMessageUsers之类的属性,这些属性是IEnumerable键入ImportantMessageUser允许使用表达式像x.ImportantMessageUsers.Count()== 0
EDIT2
当用户ID必须被过滤,这lambda表达式应该做的伎俩:
var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Where(y => y.imuUserID == 6).Count() == 0);
使用基于LINQ表示法的lambda只是一个偏好问题,但是当不需要多个连接时,lambda通常更直观易用。
检出DefaultIfEmpty()。
这里有一个例子从我老这么一个问题:
LINQ to SQL - How to add a where clause to a left join?
var z =
from im in importantMessages
join imu in importantMessageUsers
on new { im.impID, imuUserID = 7 } equals
new { imu.imuImpID, imu.imuUserID }
into imJoin
from ij in imJoin.DefaultIfEmpty()
where ij.imuImpID == null
select new
{
im.Message
...
这是对我工作。
var qry = from imp in ImportantMessages
where !(from imu in ImportantMessagesUsers where imu.ImuUsrID == 6 select imu.ImuImpID).Contains(imp.ImpID)
select imp;
这是如何工作的?没有添加用户标准? – Malcolm 2010-04-10 10:07:39
我不认为你会提出这个问题。 – Malcolm 2010-04-10 10:10:12
我认为这个答案是正确的......它返回上下文中的所有行。Important重要消息在importantMessageUsers中相关的行数是0.但它只适用于有从foreignMessageUsers到ImportantMessages的外键。 (你应该有这个FK) – Jonathan 2010-04-10 10:22:08