LINQ Join Where子句
我正在处理一个join/where子句,它是一个相当简单的sqlselect语句 我试图从tb1中检索一个产品信息列表,其后面的where条件位于tbl2中,但这必须由三个不同的列连接 因此,SQL将按照以下方式进行:LINQ Join Where子句,linq,join,where-clause,Linq,Join,Where Clause,我正在处理一个join/where子句,它是一个相当简单的sqlselect语句 我试图从tb1中检索一个产品信息列表,其后面的where条件位于tbl2中,但这必须由三个不同的列连接 因此,SQL将按照以下方式进行: SELECT tb1.* FROM tb2 INNER JOIN tb1 ON tb2.Col1 = tb1. Col1 AND tb2.Col2 = tb1. Col2 AND
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中的多个字段上进行连接,必须创建一个新的匿名类型,其中包含要比较的列,然后在连接中使用该匿名类型:
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);
如您所见,在连接的情况下,查询语法通常生成一个更易于阅读的语句。您还可以在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;
现在看来很明显,不是吗?我花了很长时间才找到解决方案。您还可以对结果进行分组并使用子查询
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;
参考资料:传奇-谢谢贾斯汀。我想如果我再勉强工作3个小时,反复试验就会把我带到这里!!非常感谢。是否可以在方法结构(流畅的接口)中实现这一点?@Maxim Zaslavsky-你的意思是使用Lambda语法吗?以下是我的意思示例:
var results=db.TableName.Where(t=>t.SomeProperty==SomeValue)代码>-这叫做Lambda语法吗?谢谢@马克西姆·扎斯拉夫斯基——是的。这就是Lambda语法。