将带有where子句的左外连接转换为Linq-to-sql
本文关键字:连接 转换 Linq-to-sql where 子句 | 更新日期: 2023-09-27 18:04:56
下面我有两个查询。我有一个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查询,我想将其转换为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
我认为你得到了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
这样的东西