c# - 如何在 Entity Linq to SQL 中获取不同的列表

标签 c# sql entity-framework linq-to-sql

我有一个通用对象表,其中每个条目都有一个键和版本。所以你可能有

Object 1, version 1  
Object 1, version 2  
Object 1, version 3  
Object 2, version 1  
Object 2, version 2

如何请求返回每个对象的最高版本,即返回对象1的版本3和对象2的版本2?我不知道如何使用 Distinct 查询,因为对象不匹配,它们有不同的版本,我想要每个对象的最高版本号

到目前为止这是我的查询

 var dbObjects = _objectStoreRepository.GetDataObjects().OrderByDescending(d => d.Version).Where(d =>
                    d.ObjectKey.ToLower().Contains(objectKey) &&
                    ((d.Status.ToLower() == request.Status.ToLower()) || string.IsNullOrEmpty(request.Status)) &&
                    d.CreatedAt <= request.AsAtTime).ToList();

但这会返回每个匹配对象的所有版本,而不仅仅是最高版本

最佳答案

你会想要使用 .GroupBy选择:

var results = _objectStoreRepository
    .GetDataObjects()
    .Where(d 
        => d.ObjectKey.ToLower().Contains(objectKey) 
        && ((d.Status.ToLower() == request.Status.ToLower()) || string.IsNullOrEmpty(request.Status)) 
        && d.CreatedAt <= request.AsAtTime)
    .GroupBy(o => o.ObjectKey)
    .Select(g => g.OrderBy(x => x.Version).LastOrDefault())
    .ToList();

首先,您按公共(public)“键”对结果进行分组,然后在对这些结果进行分组后,我们按版本对该组内的结果进行排序,并采用最后一个或默认值。您可能需要更改 Select/OrderBy 以适合您的确切数据。

关于c# - 如何在 Entity Linq to SQL 中获取不同的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40244173/

相关文章:

C# List<T> 使用 IComparer 参数排序给出编译错误

c# - Scala 中 C# 事件的惯用等价物是什么

mysql - 无法使 mysql 使用通过连接查询为表构建的索引

mysql - 如何以编程方式重命名数据库中的所有表并在所有表的名称前添加/附加一些文本?

c# - 对第 3 方类的多态扩展

c# - 需要在c#中获取字符串中 "word"之后的字符串

mysql - 如何隔离查询以查找特定字段?

c# - 我如何在 C# 中将字符串列表作为 SQL 参数传递

c# - 在 EntityFramework 中使用Where()会导致System.ArgumentException

entity-framework - 如何在桌面应用程序中使用 DataAnnotations