LINQ:如何为“on"”编写多个条件caluse
本文关键字:caluse 条件 quot on LINQ | 更新日期: 2023-09-27 18:07:58
我很难将SQL语句翻译成LINQ语句。
下面是SQL语句:SELECT * FROM dataTableA INNER JOIN dataTableB ON dataTableA.ID =dataTableB.SNo OR
dataTableA.Address = dataTableB.Address
WHERE (dataTableA.Name = dataTableB.UserName)
这是On
子句中的OR
部分,我不知道如何编写LINQ语法。我已经尝试了下面的报价没有OR
条件。请建议。
var matches = from rowA in dataTableA.AsEnumerable()
join rowB in dataTableB.AsEnumerable()
on rowA["ID"].ToString().Trim() equals rowB["SNo"].ToString().Trim()
where rowA["Name"].ToString().Trim() == rowB["UserName"].ToString().Trim()
select new { rowA, rowB } ;
试试这个
var matches = from rowA in dataTableA.AsEnumerable()
from rowB in dataTableB.AsEnumerable().Where(x=>x.SNo==rowA.ID || x.Address ==rowA.Address) .AsEnumerable()
where rowA["Name"].ToString().Trim() == rowB["UserName"].ToString().Trim()
select new { rowA, rowB } ;
您可以使用组合键来连接ID
和 Adress
https://msdn.microsoft.com/en-us/library/bb907099.aspx
dataTableA.AsEnumerable().join(dataTableB.AsEnumerable(),
ta => new {ta.ID, ta.Adress}, tb => new {tb.SNo, tb.Adress},
(ta, tb) => new {ta, tb})
如果你想在ID
或 Adress
上连接,你可以联合2连接,其中我认为应该仍然比n where
s快:为什么LINQ join比WHERE连接快得多?
dataTableA.AsEnumerable().join(dataTableB.AsEnumerable(),
ta => ta.ID, tb => tb.SNo, (ta, tb) => new {ta, tb})
.union(dataTableA.AsEnumerable().join(dataTableB.AsEnumerable(),
ta => ta.Adress, tb => tb.Adress, (ta, tb) => new {ta, tb}))
var matches = dataTableA.AsEnumerable()
.Select(a => new {
RowA = a,
RowB = dataTableB.AsEnumerable().FirstOrDefault(b => ((b["SNo"] == a["ID"]) || (b["Address"].Equals(a["Address"]))))
})
.Where(pair => pair.RowB != null) //to replicate the inner-join
.Where(pair => pair.RowA["Name"].Equals(pair.RowB["Username"]));
在对Mukesh Kalgude的答案进行了细微的修改后,问题解决了。下面是最终的工作代码。谢谢大家的友好建议。
var matches = from rowA in dataTableA.AsEnumerable()
from rowB in dataTableB.AsEnumerable().Where(x=>x["SNo"]==rowA["ID"] || x["Address"]==rowA["Address"]) .AsEnumerable()
where rowA["Name"].ToString().Trim() == rowB["UserName"].ToString().Trim()
select new { rowA, rowB } ;