从ef core linq中的重复记录中选择一个属性



我有一个包含重复记录的数据库,但只有它们的ID字段相同,其余信息不同,例如:

Id: test, version: 1.0.0
Id: test, version: 2.1.3
Id: something, version: 4.0.0
Id: something, version: 5.0.0
...

我可以用以下代码获得所有没有重复的项目

using var db = new dbContext();
var query =
from item in db.my.Select(x => new { x.Id }).Distinct()
.SelectMany(key => db.myTable.Where(x => x.Id == key.Id).Take(1))
select new myModel
{
Id = item.Id,
Versions = <Here we need all related versions>
};
return await query.ToListAsync();

现在我想获得一个ID的所有版本,并将其放在select new myModel{}中的Versions

但我不知道如何做这个

更新:我添加此行是为了查询

from versions in db.myTable.AsEnumerable().GroupBy(x => x.Id)

select new myModel
{
Id = item.Id,
Versions = versions.Select(x => x.Version).ToList()
};

但是我收到一个错误

System.InvalidOperationException: 'Processing of the LINQ expression 'GroupByShaperExpression:

这需要不同于按组返回单个项目的方法。

这里所需的操作在服务器端实现是没有意义的,因此应该在客户端完成,唯一的潜在优化是不从数据库中检索不需要的数据。

首先,使用服务器端查询来选择所需的所有数据。然后在内存中实现该查询,并在那里执行GroupBy和最终投影。

例如

var dbQuery = db.my.Select(x => new
{
x.Id,
x.Version,
});
var data = await dbQuery.ToListAsync();
var result = data
.GroupBy(x => x.Id)
.Select(g => new myModel
{
Id = g.Key,
Versions = g.Select(x => x.Version).ToList(),
});

最新更新