使用where子句将左外连接转换为Linq-to-sql

时间:2016-08-30 12:47:46

标签: c# sql sql-server linq

下面我有两个问题。我有一个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

1 个答案:

答案 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这样的内容