【问题标题】:Select a property from duplicate records in ef core linq从 ef core linq 中的重复记录中选择一个属性
【发布时间】:2021-08-29 00:21:45
【问题描述】:

我有一个包含重复记录的数据库,但只有它们的 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 并将其放入 Versions 中的 select new myModel{}

但我不知道该怎么做

更新: 我添加了这一行来查询

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:

【问题讨论】:

  • 什么是Versions?如果它是my 实体类实例的列表,则切换回在内存中执行GroupBy 的原始解决方案(AsEnumerable().GroupBy(...))。上一个问题的解决方案是针对每个唯一 Id 返回 single 项。最好提前确切知道您需要什么结果,因为不幸的是方法不同。
  • Versions 是 List,正如你在上一篇文章中回答的那样,现在另外,我想获取每个 id 的版本
  • 我的意思是,我需要两个,一个不重复的列表,每个项目都有自己的版本
  • 按照其他答案中的建议在内存中执行此操作。反正这么简单的任务问题太多了。
  • @SvyatoslavDanyliv 我更新了我的问题,我使用了记忆法,但出现了错误。你的方法和记忆方法好像没有结合起来

标签: c# linq entity-framework-core


【解决方案1】:

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

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

首先,使用服务器端查询选择所有需要的数据。然后在内存中实现该查询并在那里执行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(),
    });

【讨论】:

  • 谢谢,如果我想获得其他字段,如姓名,我应该写这个吗? Name = g.Select(x =&gt; x.Name).First(),
  • 是的,你可以。执行 db 查询并将结果存储在内存中之后的所有内容都在常规 LINQ to Objects 上下文中运行,基本上所有编译成功的内容都在其中运行。
猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 2013-03-09
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多