2010-08-23 68 views
15

我正在努力与联系/ where子句与什么是一个相当简单的sql select语句。LINQ加入我的条款

我想从位于tbl2后面的位置条件中检索tb1的产品信息列表,但这必须由三个不同的列连接。

所以SQL看起来沿着线的东西:

SELECT  tb1.* 
FROM   tb2 INNER JOIN 
         tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND 
         tb2.Col3 = tb1.Col3 
WHERE  (tb2.Col1 = col1) AND (tb2.Col2 = col2) AND (tb2.Col4 = string) 

COLX为主,其中以字符串子句传递作为参数;所有其他列都在上下文中。

如何用where子句实现多个连接?

并推向正确的方向,非常感谢。

回答

42

要加入对LINQ多个领域,你必须创建一个包含要比较的列一个新的匿名类型,然后使用该匿名类型的连接:

var results = from t1 in context.tb1 
       join t2 in context.tb2 
       on new { t1.Col1, t1.Col2, t1.Col3 } equals 
        new { t2.Col1, t2.Col2, t2.Col3 } 
       where t2.Col1 == col1 && t2.Col2 == col2 && t2.Col4 == someString 
       select t1; 

这里是相当于LAMBDA语法:

var results = context.tb1.Join(
        context.tb2, 
        t1 => new { t1.Col1, t1.Col2, t1.Col3 }, 
        t2 => new { t2.Col1, t2.Col2, t2.Col3 }, 
        (t1, t2) => new { t1, t2 }) 
       .Where(o => o.t2.Col1 == col1 
        && o.t2.Col2 == col2 
        && o.t2.Col4 == someString) 
       .Select(o => o.t1); 

正如你所看到的,在连接的情况下,查询语法通常会产生一个更容易阅读的语句。

+0

图例 - 感谢贾斯汀。我想,如果我继续刮了另外3个小时,反复试验会让我在这里!非常感谢。 – 2010-08-23 13:19:29

+0

是否有可能在方法结构(流畅接口)中做到这一点? – 2010-09-05 21:50:43

+1

@Maxim Zaslavsky - 你的意思是使用Lambda语法? – 2010-09-06 01:18:50

7

您还可以在lamda语法中对您加入的表的引用中包含WHERE子句。

 var query = from pt in dc.ProjectTasks 
        join ttab in dc.TimeTaskAssigns on pt.Id equals ttab.ProjectTaskId 
        join ttb2 in dc.CMS_TAT_TIMEs.Where(a => a.WIP_STATUS == 'B') on ttab.CmsTimeUno equals ttb2.TIME_UNO 
        select pt; 

现在看起来很明显,不是吗?我花了很长时间才找到解决方案。