我有以下SQL表。
ImportantMessages
impID
消息
ImportantMessageUsers
imuID
imuUserID
imuImpID
我想写一个Linq2Sql查询,以便它从ImportantMessages返回任何行 在ImportantMessagesUsers中没有记录。
匹配字段是 impID ----- imuImpID
假设imuUserID为6
答案 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;