将带有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

将带有where子句的左外连接转换为Linq-to-sql

我认为你得到了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这样的东西