【问题标题】:Select Distinct from DataTable using Linq and C#使用 Linq 和 C# 从 DataTable 中选择 Distinct
【发布时间】:2014-10-18 21:21:27
【问题描述】:

我需要使用 linq 和 C# 从数据表中选择不同的记录,但我似乎无法获得正确的语法。我有以下代码,它返回数据表中的所有行,我如何只返回 DISTINCT 行?

DataTable dt = ds.Tables[0];
var q = from dr in dt.AsEnumerable() select dr;

【问题讨论】:

    标签: c# linq datatable distinct


    【解决方案1】:

    您需要使用DataRowComparer

    IEnumerable<DataRow> distinctRows = 
        dt.AsEnumerable().Distinct(DataRowComparer.Default);
    

    有关使用 linq 与数据集比较数据行的更多信息,请参阅here

    【讨论】:

      【解决方案2】:

      我们可以:

      var q = (from dr in dt.AsEnumerable() select dr).Distinct(DataRowComparer.Default);
      

      但实际上,from x in ... select x 是多余的,所以我们可以:

      var q = dt.AsEnumerable().Distinct(DataRowComparer.Default);
      

      但是大部分时间AsEnumerable() 都会做,要么什么都没有(如果它已经是这样的话)要么可能会减慢速度(如果可以在其他地方更好地处理 distinct),所以通常最好这样做:

      var q = dt.Distinct(DataRowComparer.Default);
      

      虽然有些情况下前者胜过后者。

      【讨论】:

      • 这将通过引用来比较行,而不是基于字段值
      • @vc74 没错,我提到了覆盖,但甚至没有注意到这是必须使用的情况,哎呀。
      • 别担心,顺便说一句,你的意思是 dt.ROWS.Distinct(DataRowComparer.Default) 吗?
      • @vc74 哈哈。是的,是的,我做到了。我想我会在这一点上离开它。你的评论修复了这个缺陷,太多的修复达到了不诚实的程度。
      • 对我来说这句话读起来很诚实:)
      【解决方案3】:
      (from dr in dt.AsEnumerable() select dr).Distinct();
      

      【讨论】:

      • 这对我来说也很有意义,我缺少什么参考?我收到以下错误:错误 1“System.Data.EnumerableRowCollection”不包含“Distinct”的定义,并且没有扩展方法“Distinct”接受“System.Data.EnumerableRowCollection”类型的第一个参数' 可以找到(您是否缺少 using 指令或程序集引用?)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多