【问题标题】:C# LINQ - How to get distinct record?C# LINQ - 如何获得不同的记录?
【发布时间】:2018-02-02 02:57:53
【问题描述】:

我有一个这样的 SQL 表:

如何获得每个不同键列的最大值?

我的预期结果是:

【问题讨论】:

  • 回答中的以下查询不符合目的?

标签: c# sql asp.net entity-framework linq


【解决方案1】:
<tableName>.GroupBy(k => k.key)
           .Select(g => g.OrderByDescending(v => v.value)
           .FirstOrDefault());

【讨论】:

  • 它就像一个魅力!但它不允许我使用 .First() 命令,而是使用 .FirstOrDefault()
  • 谢谢!我通常使用 .FirstOrDefault()。很高兴它有帮助。使用 .First() 还假设每个组中至少有 1 个项目,否则会引发错误。感谢您简洁明了的问题。大多数时候,人们过于含糊或写小说来解释他们试图实现的目标。
【解决方案2】:

假设我有 ID 和年龄的 Employee 类。下面的查询应该以预期的格式返回您的结果。基本上查询要按 Id 对项目进行分组并从每个组返回最大值。

List<Empployee> lst = new List<Empployee>();

            lst.GroupBy(g => g.ID).ToList().ForEach(g =>
            {
                Console.WriteLine($"Key:{g.Key} and Value:{g.Max(m => m.Age)}");
            });

public class Empployee
        {
           public int ID { get; set; }
           public int Age { get; set; }
        }

【讨论】:

  • 谢谢,它有效。但是我标记的答案更容易理解。
【解决方案3】:

试试这个:

source
    .GroupBy(x => x.Key)
    .SelectMany(x => x.OrderByDescending(y => y.Value).Take(1));

最好养成使用SelectMany/Take(1) 组合而不是Select/First() 的习惯,因为前者对添加Where 子句很有效,而后者则不然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 2015-04-27
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多