【问题标题】:Not Equal in LINQ?在 LINQ 中不相等?
【发布时间】:2010-10-21 09:59:03
【问题描述】:

表记录:

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

此查询返回“我的列表”中的匹配数据。现在我需要换一种方式来显示彼此不相等的连续剧。

退了

SerialNumber    Status
002              N/A
003              N/A

提前致谢!

【问题讨论】:

标签: c# linq linq-to-sql


【解决方案1】:

您可以像这样实现 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"]
         };

【讨论】:

  • 从问题中的示例输出来看,OP 需要来自 BOTH 列表的不匹配项目。目前您只能从TableB 获取项目,因此您需要对TableA 执行相同操作并连接结果。
  • DataRow 在实现 IEquality 时没有定义字段。
  • 我不确定你指的是什么。你能详细说明一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 2014-10-20
  • 2020-09-20
相关资源
最近更新 更多