1

如何重载 except() 方法以仅比较行集合中的第一个字段?如果我在下面的两个查询中的列数不相等(一个 qry 中的额外字段但另一个没有)怎么办?

我已经阅读了一些与我类似的自定义相等比较器问题,但找不到我的解决方案的确切答案。

请帮助我编写重载代码,因为我是 except 方法的新手。

    //Pass in your two datatables

    //build the queries based on id and name.

    var qry1 = datatable1.AsEnumerable().Select(a => new { ID = a["ID"].ToString(), Name = a["NAME"].ToString() });
    var qry2 = datatable2.AsEnumerable().Select(b => new { ID = b["ID"].ToString(), Name = b["NAME"].ToString()  });


    //detect row deletes - a row is in datatable1 except missing from datatable2
    var exceptAB = qry1.Except(qry2);

    //detect row inserts - a row is in datatable2 except missing from datatable1
    var exceptAB2 = qry2.Except(qry1);


    //then I execute my code here

    if (exceptAB.Any())
    {
        foreach (var id in exceptAB)
        {
      //print to console id and name
        }


    }
    if (exceptAB2.Any())
    {
        foreach (var id in exceptAB2)
        {
     //print to console id and name
        }
    }

编辑:我通过使用 linq 查询解决了这个问题。我已经将 ID 存储在一个变量中,所以我只是使用 Contains() 来提取我需要的额外字段。

        var vProjectSummary =  from a in dt1.AsEnumerable()
                            where sDelProjSummCheck.Contains(a.Field<string>("ID"))
                            select new
                            {
                                INV_ID = a.Field<string>("ID"),
                                It_Group = a.Field<string>("IT_GROUP"),
                                L6 = a.Field<string>("L6"),
                                Test_Mgr = a.Field<string>("TEST_MGR"),
                                INV_NAME = a.Field<string>("INV_NAME")
                            };



       //
       //
       //
        var vInsProjectSummary = from a in dt2.AsEnumerable()
                                 where sInsProjSummCheck.Contains(a.Field<string>("ID"))
                              select new
                              {
                                  INV_ID = a.Field<string>("ID"),
                                  INV_NAME = a.Field<string>("INV_NAME")
                              };
4

1 回答 1

0

好吧,如果你必须使用除非你不需要重载方法调用,你只需要构建一个扩展 IEqualityComparer 接口的类。有关示例用法,请参阅http://msdn.microsoft.com/en-us/library/bb336390.aspx。缺点是你不能用匿名类型来做,你必须创建一个类来存储列数据。

如果您不必使用 except,您可以通过执行以下操作来使用匿名类型完成相同的结果:

var exceptAB = qry1.Where(q1 => !qry2.Any(q2 => q2.ID == q1.ID)); var exceptBA = qry2.Where(q2 => !qry1.Any(q1 => q1.ID == q2.ID));

于 2013-07-11T03:13:49.490 回答