.net 如何在实体框架查询中获取包含的最新版本

8oomwypt  于 2022-12-01  发布在  .NET
关注(0)|答案(1)|浏览(90)

我有以下表格:
研究中心:
| 识别码|名称名称名称|
| - -|- -|
| 一个|站点1|
| 2个|站点2|
项目名称:
| 识别码|版本号|项目名称|站点ID|
| - -|- -|- -|- -|
| 一个|一个|测试1|一个|
| 一个|2个|测试2|一个|
其中IdVersion是主键。
我想得到一个网站和它的最新项目。
我目前的最佳解决方案如下:

var sitesFirst = await context.Sites.AsNoTracking().Include(s => s.UserRelations).ToListAsync();

foreach (var site in sitesFirst)
{
    var projects = await context.Projects.AsNoTracking()
        .Where(p => p.SiteId == site.Id)
        .GroupBy(p => p.Id)
        .Select(grouping => grouping.OrderByDescending(p => p.Version).First())
        .ToListAsync();
    site.Projects = (List<Project>?)projects;
}

return sitesFirst;

这对于多次往返不是最佳的。
我尝试过不同的方法来分组和降序排序,但EF似乎经常抱怨它不能翻译它。
这是使用EF 6时的情况

hgqdbh6s

hgqdbh6s1#

如果您有DTO类(例如SiteDto),则可以使用Select投影到该类中。

var latestProjects = context.Projects
    .GroupBy(p => new { p.SiteId, p.Id })
    .Select(grouping => grouping.OrderByDescending(p => p.Version).First());

var sitesFirst = await context.Sites
    .Select(s => new SiteDto
    {
        Id = s.Id,
        ... // other properties

        Projects = latestProjects
            .Where(p => p.SiteId == s.Id)
            .ToList()
    })
    .ToListAsync();

return sitesFirst;

相关问题