下面我有两个问题。我有一个Sql查询和linq查询我一直在修改。我无法让linq查询在逻辑上等同于sql查询。我当前的问题存在于以下注释//right here
的行中。
我在尝试访问u.isDeleted
时出现编译错误:
名称' u'在当前上下文中不存在
有人可以告诉我原因并帮我修复查询以便编译。如果这不是一种最佳的做法,我愿意接受建议。非常感谢!!!!
Linq(没有工作)
var ret = (from m IN db.Foo
join u in db.Bar on m.Id equals u.m_Id
into FooBars
from vm IN db.Temp.DefaultIfEmpty()
where vm == null && u.Id = 32 // right here
select m).ToList();
Sql Query,我想将其转换为linq
SELECT m.*
FROM Foo AS m
INNER JOIN Bar AS u ON m.Id = u.m_Id
LEFT JOIN Temp AS vm on u.M_Id = temp.m_Id
WHERE vm.id IS NULL AND u.Id = 32
答案 0 :(得分:4)
我认为你的left join
语法错误了。这是如何:
var ret = (from m IN db.Foo
join u in db.Bar on m.Id equals u.m_Id
join vm in db.Temp on u.M_Id = temp.m_Id into vmg
from vm im vmg.DefaultIfEmpty()
where vm == null && u.IsDeleted
select m).ToLIST();
into X
语法为GroupJoin
方法 - 因此您在加入db.Bar
时使用错误 - 您需要正常加入GroupJoin
,然后从添加DefaultIfEmpty
的组中进行选择。 请参阅左连接的文档 - 它在上面的查询语法和方法语法中都显示(并使用GroupJoin
)
至于你的编译错误:
当前上下文中不存在名称“u”
您的查询:
var ret = (from m IN db.Foo
join u in db.Bar on m.Id equals u.m_Id
into FooBars
from vm IN db.Temp.DefaultIfEmpty()
where vm == null && u.Id = 32 // right here
select m ).ToList();
原因是您将联接的所有结果归为FooBars
- 因此在该行之后,您的查询中没有u
这样的内容