LINQ Join Where子句

vcirk6k6  于 2023-10-13  发布在  其他
关注(0)|答案(3)|浏览(152)

我正在努力使用一个join/where子句和一个相当简单的sql select语句。
我试图从tb 1中检索产品信息列表,其中where条件位于tbl 2中,但这必须由三个不同的列连接。
因此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子句实现多个连接?

l3zydbqr

l3zydbqr1#

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

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

tzcvj98z

tzcvj98z2#

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

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

8qgya5xd

8qgya5xd3#

你也可以分组结果和使用子查询

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)

相关问题