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 } ;

LINQ:如何为“on"”编写多个条件caluse

试试这个

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 Adresshttps://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 } ;