Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ:如何为“写多个条件”;关于;卡尔斯?_C#_Linq - Fatal编程技术网

C# LINQ:如何为“写多个条件”;关于;卡尔斯?

C# LINQ:如何为“写多个条件”;关于;卡尔斯?,c#,linq,C#,Linq,我很难将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子句中的一部分,我不知道如何编写LINQ语法。我已经

我很难将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
子句中的一部分,我不知道如何编写LINQ语法。我已经尝试了以下没有
条件的报价。请告知

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

在对穆克什·卡尔古德的答案稍作修改后,问题解决了。下面是最终确定的工作代码。谢谢大家的建议

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

如果您想在
ID
address
上加入,您可以联合2个加入,我认为这应该比n
更快,其中
s:


可能重复感谢您的回答。但这显示的错误消息“System.Data.DataTable不包含'Where'的定义,也没有扩展方法'Where'接受类型为'System.Data.DataTable'的第一个参数,可以在dataTableB.Where(x=>…)部分找到。我做了一些更改,效果很好。非常感谢您的帮助。@HtetThuzar如果是帮助,请不要说谢谢,如果有vot和正确的标记,我们也可以使用更直接的
加入
谢谢。但我的要求是,如果两个表中的名称相同,则在ID或地址上联接两个表。只有在所有名称、ID和地址都相同的情况下,复合键的想法才会连接两个表。
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 } ;
dataTableA.AsEnumerable().join(dataTableB.AsEnumerable(),
  ta => new {ta.ID, ta.Adress}, tb => new {tb.SNo, tb.Adress}, 
  (ta, tb) => new {ta, tb})
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}))