Ric*_*ano 22 linq join where-clause
我正在努力使用一个相当简单的sql select语句的join/where子句.
我正在尝试从tb1检索产品信息列表,其中where where condition位于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)
Run Code Online (Sandbox Code Playgroud)
ColX是主要的where子句,其中字符串作为参数传入; 所有其他列都在上下文中.
如何使用where子句实现多个连接?
并向正确的方向推,非常感谢.
Jus*_*ner 53
要在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;
Run Code Online (Sandbox Code Playgroud)
这是等效的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);
Run Code Online (Sandbox Code Playgroud)
如您所见,在连接的情况下,查询语法通常会生成更易于阅读的语句.
Mar*_*ams 11
您还可以在对要加入的表的引用中包含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;
Run Code Online (Sandbox Code Playgroud)
现在看来显而易见,不是吗?我花了很长时间才找到解决方案.