Linq2Sql如何编写外连接查询?

时间:2010-04-10 09:56:29

标签: linq-to-sql

我有以下SQL表。

ImportantMessages

impID

消息

ImportantMessageUsers

imuID

imuUserID

imuImpID

我想写一个Linq2Sql查询,以便它从ImportantMessages返回任何行 在ImportantMessagesUsers中没有记录。

匹配字段是 impID ----- imuImpID

假设imuUserID为6

3 个答案:

答案 0 :(得分:2)

就像

一样简单
var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Count() == 0);

修改

我想我已经很好地理解了这个问题,你必须从ImportantMessages表中获取所有消息,而没有在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通常更直观易用。

答案 1 :(得分: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
        ...

答案 2 :(得分:1)

这对我有用。

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