2010-10-21 49 views
3

表Reords:在LINQ中不等於?

TableA 

SerialNUmber Status 
001    OK 
002    N/A 

TableB 

SerialNumber Status 
001    OK 
003    N/A 

    var ret = (from p in TableA.AsEnumerable() 
     join q in TableB.AsEnumerable() 
     on p.Field<string>("SerialNumber") equals q.Field<string>("SerialNumber") 
      select new 
      { 
       SerialNUmber = q["SerialNumber"], 
       UnitStatus = "HOT", 
       PartNumber = q["PartNumber"] 
      }).ToList(); 

ret 

SerialNumber Status 
001    OK 

該查詢返回我的列表的匹配數據。現在我需要做另一種方式來顯示彼此不相等的序列。

RET

SerialNumber Status 
002    N/A 
003    N/A 

先謝謝了!

+0

類似http://stackoverflow.com/questions/3669507/using- linq-not-equals – Myra 2010-10-21 10:16:39

回答

2

您可以實現這樣的EqualityComparer:

public class SerialNumberComparer : IEqualityComparer<DataRow> 
{ 
    public bool Equals(Datarow d1, DataRow d2) 
    { 
    return d1.Field<string>("SerialNumber") == d2.Field<string>("SerialNumber"); 
    } 
} 

然後使用LINQ擴展方法Except

var aEnum = TableA.AsEnumerable(); 
var bEnum = TableB.AsEnumerable(); 
var comp = new SerialNumberComparer(); 
var ret = from q in bEnum.Except(aEnum, comp).Concat(aEnum.Except(bEnum, comp)) 
select new 
     { 
      SerialNumber = q["SerialNumber"], 
      UnitStatus = "HOT", 
      PartNumber = q["PartNumber"] 
     }; 
+0

根據問題中的示例輸出來判斷,OP要求從兩個列表中選擇不匹配的項目。目前,您只能從'TableB'中獲取項目,因此您需要對'TableA'執行相同操作並連接結果。 – Yakimych 2010-10-21 10:57:48

+0

根據您的輸入更正了代碼 - 謝謝! – 2010-10-21 11:06:30

+0

DataRow在實現IEquality時沒有定義字段。 – Crimsonland 2010-10-21 23:55:10