views:

110

answers:

1
+3  Q: 

Not Equal in LINQ?

Table Reords:

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

This Query Returns the Match Data on My List. Now I need to do the other Way around to show the Serials that is not equal with one another.

ret

SerialNumber    Status
002              N/A
003              N/A

Thanks in Advance!

+2  A: 

You could implement an EqualityComparer like this:

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

And then use the LINQ extension method 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"]
         };
Heini Høgnason
Judging by the sample output in the question, the OP requires non-matching items from BOTH lists. Currently you only get items from `TableB`, so you need to do the same for `TableA` and concatenate the results.
Yakimych
Corrected code according to your input - thanks!
Heini Høgnason
DataRow has no Definition field on implementing IEquality.
Crimsonland
I'm not certain what you are referring to. Could you perhaps elaborate?
Heini Høgnason