考虑以下查询,该查询必须返回导演以及每部电影的电影数量和演员数量。如何使用 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__AnonymousType8
1(DirectorName = [d].DirectorName), new <>f__AnonymousType6
2(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__AnonymousType6
2(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; }
}