【问题标题】:LINQ Join Where ClauseLINQ Join Where 子句
【发布时间】:2010-08-23 12:48:21
【问题描述】:

我正在为一个相当简单的 sql 选择语句的 join/where 子句而苦苦挣扎。

我正在尝试从 tb1 检索产品信息列表,其中 where 条件位于 tbl2 中,但这必须由三个不同的列连接。

所以 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 子句,带有要作为参数传入的字符串;所有其他列都在上下文中。

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

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

【问题讨论】:

    标签: linq join where-clause


    【解决方案1】:

    要在 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);
    

    如您所见,在连接的情况下,查询语法通常会产生更易于阅读的语句。

    【讨论】:

    • 传奇 - 谢谢贾斯汀。我想如果我再坚持 3 个小时,试错就会让我来到这里!非常感谢。
    • 是否可以在方法结构(流利的接口)中做到这一点?
    • @Maxim Zaslavsky - 你的意思是使用 Lambda 语法吗?
    • 这是我的意思的一个例子:var results = db.TableName.Where(t=>t.SomeProperty==SomeValue); - 是不是叫做 Lambda 语法?谢谢!
    • @Maxim Zaslavsky - 是的。那就是 Lambda 语法。
    【解决方案2】:

    您还可以在对要加入的表的引用中包含 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;
    

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

    【讨论】:

      【解决方案3】:

      您还可以对结果进行分组并使用子查询

      var innerGroupJoinQuery2 =
          from category in categories
          join prod in products on category.ID equals prod.CategoryID into prodGroup
          from prod2 in prodGroup
          where prod2.UnitPrice > 2.50M
          select prod2;
      

      参考:join clause (C# Reference)

      【讨论】:

      • from prod2 in prodGroup 这是内存中的权利还是仅在数据库服务器上?你能解释一下那部分吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多