如何在Entity Linq to SQL中获取一个不同的列表

时间:2016-10-25 15:38:50

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

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

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();

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

1 个答案:

答案 0 :(得分:0)

您需要使用带有选择的.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();

首先,按照常用&#34;键&#34;对结果进行分组。然后,一旦这些分组,我们按版本在该组内部排序结果,并取最后一个或默认值。您可能需要更改Select / OrderBy以适合您的确切数据。