【问题标题】:Using .Distinct() on certain rows在某些行上使用 .Distinct()
【发布时间】:2012-03-19 20:58:20
【问题描述】:

我有一个 Linq 查询,它根据 where 子句将存储在表中的所有数据作为列表返回:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id).ToList();

这将返回 23 个项目,但其中一些项目的某些列包含重复数据,我将它们称为 ColumnA、ColumnB 和 ColumnD。我试过了:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id)
                .Distinct().ToList();

但这只是返回相同的 23 行。我想要的是,如果我可以指定我想要具有不同值的列,例如:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id)
                .Distinct(x=> new { x.ColumnA, x.ColumnB, x.ColumnD }).ToList();

这可能吗,还是我应该寻找一种新的方式来做到这一点?

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    尝试结合GroupByFirst

    List<Catalogue> data = context.Catalogue
        .Where(x => x.ManID == id)
        .GroupBy(x => new { x.ColumnA, x.ColumnB, x.ColumnD })
        .Select(g => g.First())
        .ToList();
    

    【讨论】:

    • 只是对此进行了调整:我不得不使用 FirstOrDefault() 因为 First() 抛出了一个错误,但这非常有效,谢谢!我也会接受作为答案!
    【解决方案2】:

    这取决于上下文。如果这是在 LINQ to SQL 之类的范围内,我会使用 GroupBy:

    List<Catalogue> data = context.Catalogue
                                  .Where(x=>x.ManID == id)
                                  .GroupBy(x=> new { x.ColumnA, 
                                                     x.ColumnB, 
                                                     x.ColumnD })
                                  .Select(g => g.First())
                                  .ToList();
    

    (编辑:请注意,在这里使用First 真的应该 没问题 - 您不需要使用FirstOrDefault(),因为每个组必须至少有一个条目才能存在.)

    在 LINQ to Objects 中,我会使用 MoreLINQ 及其 DistinctBy 方法:

    List<Catalogue> data = context.Catalogue
                                  .Where(x=>x.ManID == id)
                                  .DistinctBy(x=> new { x.ColumnA, 
                                                        x.ColumnB, 
                                                        x.ColumnD })
                                  .ToList();
    

    【讨论】:

      【解决方案3】:

      我将为可与Distinct() 一起使用的3 个属性创建一个IEqualityComparer

      IEqualityComparer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 2018-06-13
        • 2011-03-29
        • 2015-06-22
        相关资源
        最近更新 更多