0

考虑以下查询,该查询必须返回导演以及每部电影的电影数量和演员数量。如何使用 EF CORE 2.2 在 LINQ 中编写此代码?我需要 LINQ 生成实际使用 GROUP BY 和 EF CORE 2.1 和转发中支持的 SQL 聚合的 SQL。

SELECT DirectorName, COUNT(m.MovieID), COUNT(a.ActorID)
FROM Directors d
LEFT OUTER JOIN Movies AS m ON m.DirectorID = d.DirectorID
LEFT OUTER JOIN Actors AS a ON a.MovieID = m.MovieID
WHERE d.DirectorID = 1
GROUP BY DirectorName

示例 LINQ 查询是基于答案构建的,并且确实给了我结果,但该查询只有一个 LEFT 连接,没有 group by。输出表明 DefaultIfEmpty()、GroupBy 和 Count 无法翻译,将在本地进行评估。

var results =
(
    from d in _moviesContext.Directors
    join m in _moviesContext.Movies on d.DirectorId equals m.DirectorId 
        into grpM from movies in grpM.DefaultIfEmpty()
    join a in _moviesContext.Actors on movies.MovieId equals a.MovieId
        into grpA from actors in grpA.DefaultIfEmpty()
    where d.DirectorId == 1
    group new { d, grpM, grpA } by new
    {
        d.DirectorName
    } into grp
    select new
    {
        DirectoryName = grp.Key.DirectorName,
        MovieCount = grp.Sum(g => g.grpM.Count()),
        ActorAcount = grp.Sum(g => g.grpA.Count())
    }
).ToList();

无法翻译 LINQ 表达式“DefaultIfEmpty()”并将在本地计算。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“DefaultIfEmpty()”,将在本地进行评估。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“来自 {[grpM] => DefaultIfEmpty()} 中的电影电影”,并将在本地进行评估。Microsoft.EntityFrameworkCore.Query:Warning: LINQ 表达式 'GroupBy(new <>f__AnonymousType81(DirectorName = [d].DirectorName), new <>f__AnonymousType62(d = [d], grpM = [grpM]))' 无法翻译,将在本地进行评估。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“DefaultIfEmpty()”,将在本地进行评估。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“DefaultIfEmpty()”,将在本地进行评估。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“来自 {[grpM] => DefaultIfEmpty()} 中的电影电影”,并将在本地进行评估。Microsoft.EntityFrameworkCore.Query:Warning: LINQ 表达式 'GroupBy(new <>f__AnonymousType81(DirectorName = [d].DirectorName), new <>f__AnonymousType62(d = [d], grpM = [grpM]))' 无法翻译,将在本地进行评估。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“Count()”并将在本地进行评估。Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“Sum()”,将在本地进行评估。

这里是模型

public partial class Directors
{
    public int DirectorId { get; set; }
    public string DirectorName { get; set; }
}

public partial class Movies
{
    public int MovieId { get; set; }
    public string MovieName { get; set; }
    public int? DirectorId { get; set; }
}

public partial class Actors
{
    public int ActorId { get; set; }
    public string ActorName { get; set; }
    public int? MovieId { get; set; }
}
4

1 回答 1

0

我不确定为什么当一个演员通常有一个电影列表时你的演员只有一个电影 ID 的 int 但我相信你需要在你的组中包含所有三种对象类型,然后选择不同的电影和不同的演员来获得计数.

例子:

var directors = new[] { new { DirectorName = "Director A", DirectorID = 1 },
                        new { DirectorName = "Director B", DirectorID = 2 }};
var movies = new[] { new { MovieName = "Movie A", MovieID = 1, DirectorID = 1 },
                     new { MovieName = "Movie B", MovieID = 2, DirectorID = 2 }};
var actors = new[] { new { ActorName = "Actor A", ActorID = 1, MovieID = 1},
                     new { ActorName = "Actor B", ActorID = 2, MovieID = 1},
                     new { ActorName = "Actor C", ActorID = 3, MovieID = 1},
                     new { ActorName = "Actor D", ActorID = 4, MovieID = 2}};

var results = from d in directors
              from m in movies
                .Where(m => m.DirectorID == d.DirectorID)
              from a in actors
                .Where(a => a.MovieID == m.MovieID)
              where d.DirectorID == 1
              group new { d, m, a } by d.DirectorName into grp
              select new 
              { DirectorName = grp.Key,
                MovieCount = grp.Select(x => x.m).Distinct().Count(),
                ActorCount = grp.Select(x => x.a).Distinct().Count()
              };

将产生

result = new [] { new { DirectorName = "Director A", MovieCount = 1, ActorCount = 3}};
于 2019-02-28T20:49:59.247 回答