LINQ根据条件加入不同的表

时间:2013-11-27 19:19:26

标签: c# linq linq-to-sql

如何根据条件加入两个不同的表?

我的查询如下:

var myquery = from p in db.tbl1
              join q in db.tbl2 on p.field1 equals q.field1
              join r in db.tbl3 on q.field2 equals r.field2

直到这里一切都很好,现在我想再添加1个连接到一个表,但它应该基于如下条件:

if(q.field3 == 1)
    join s in db.tbl4 on q.field4 equals s.field4
 else if(q.field3 == 2)
    join s in db.tbl5 on ....

所以基本上我想根据q.field3的值加入不同的表。

1 个答案:

答案 0 :(得分:2)

您无法根据单行的值有条件地加入。加入的想法是你基于所有行加入。根据查询之外的某些值有条件地确定连接的内容/方式是有意义的。

可以做的是无条件地进行两次连接,但是选择每行有条件地使用哪个结果。显然,只有当表格属于同一类型,或者您首先将s1s2投影到一个公共类型(使用let

时,这才有效
var myquery = from p in db.tbl1
    join q in db.tbl2 on p.field1 equals q.field1
    join r in db.tbl3 on q.field2 equals r.field2
    join s1 in db.tbl4 on q.field4 equals s1.field4
    join s2 in db.tbl5 on q.field5 equals s2.field5
    let s = q.field3 == 1 ? s1 : 
            q.field3 == 2 ? s2 : null

应该能够被查询提供程序翻译成CASE语句。