2010-04-10 24 views
0

我有以下的SQL表。Linq2Sql如何编写外部连接查询?

ImportantMessages

impID

消息

ImportantMessageUsers

imuID

imuUserID

imuImpID

我想编写一个Linq2Sql查询,以便它返回ImportantMessagesUsers中没有记录的重要消息 中的任何行。

Matchiing字段 impID ----- imuImpID

假设的6

回答

2

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通常更直观易用。

+0

这是如何工作的?没有添加用户标准? – Malcolm 2010-04-10 10:07:39

+0

我不认为你会提出这个问题。 – Malcolm 2010-04-10 10:10:12

+0

我认为这个答案是正确的......它返回上下文中的所有行。Important重要消息在importantMessageUsers中相关的行数是0.但它只适用于有从foreignMessageUsers到ImportantMessages的外键。 (你应该有这个FK) – Jonathan 2010-04-10 10:22:08

1

检出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 
     ... 
+0

我的问题是,即使阅读了一些文档后,我无法解决? – Malcolm 2010-04-10 10:22:11

+0

您还没有考虑到用户ID。 – Malcolm 2010-04-10 10:38:01

+0

我添加了一个示例。你有LinqPad吗?通过将其用作暂存器更容易工作。有一个免费版本。 – Steve 2010-04-10 10:38:38

1

这是对我工作。

var qry = from imp in ImportantMessages 
where !(from imu in ImportantMessagesUsers where imu.ImuUsrID == 6 select imu.ImuImpID).Contains(imp.ImpID) 
select imp;