【问题标题】:How to write LINQ for multiple joins involving self join?如何为涉及自联接的多个联接编写 LINQ?
【发布时间】:2017-01-26 19:00:40
【问题描述】:

我正在尝试将以下带有自连接的查询转换为 LINQ 表达式。

select r2.* from depends d
  join request r on d.DESC =r.DESC
  join request r2 on d.ID=r2.ID
  and d.TYPE ='sometype'
where r.ID= 12345

如何更正以下 LINQ 查询以匹配上面正确的 SQL 查询?

var result = (from d in depends
            join r in request on d.DESC equals r.DESC
            join r2 in request on d.ID == r2.ID && d.TYPE == incomingType.ToString()
            where r.ID == incomingId
            select r2).AsEnumerable();

【问题讨论】:

  • 首先,SQL 查询中没有自连接,只有同一张表的两个连接。其次,SQL查询奇怪且不一致,d.TYPE='sometype'r.ID=12345条件都涉及一个表,因此应该简单地放在where子句中。

标签: c# linq


【解决方案1】:

如果你的incomingType 是固定的,你为什么不简单地使用Where 子句?

还有多个连接条件的语法,如下所示:LINQ Joining in C# with multiple conditions

例如:

var result = (from d in depends
              where d.TYPE == incomingType.ToString()
              join r in request on
              new { ID = r.ID, desc = r.DESC }
              equals 
              new { ID = d.ID, desc = d.DESC }
              where r.ID == incomingId
              select r).AsEnumerable();

如果您的incomingType 实际上没有固定,并且它从depends 表中获取其值,您可以在连接条件中添加第三个参数,例如

var result = (from d in depends
              where d.TYPE == incomingType.ToString()
              join r in request on
              new { ID = r.ID, desc = r.DESC, type = r.someType1 }
              equals 
              new { ID = d.ID, desc = d.DESC, type = d.someType2 }
              where r.ID == incomingId
              select r).AsEnumerable();

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 2016-07-30
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多