我有一个包含重复记录的数据库,但只有它们的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(),
});