Entity framework EF LINQ查询到SQL外部应用
如何生成这样的SQL代码:Entity framework EF LINQ查询到SQL外部应用,entity-framework,linq,entity-framework-core,Entity Framework,Linq,Entity Framework Core,如何生成这样的SQL代码: SELECT TOP(10) c.Id AS CarId, r.FranceAccessoriesCount, r.GermanyAccessoriesCount, r.ItalyAccessoriesCount FROM [Cars] AS c OUTER APPLY (SELECT SUM(CASE WHEN a.ManufacturerCountry = 'France' then 1 ELSE 0 END) as FranceAccessoriesCo
SELECT TOP(10) c.Id AS CarId, r.FranceAccessoriesCount, r.GermanyAccessoriesCount, r.ItalyAccessoriesCount
FROM [Cars] AS c
OUTER APPLY (SELECT
SUM(CASE WHEN a.ManufacturerCountry = 'France' then 1 ELSE 0 END) as FranceAccessoriesCount,
SUM(CASE WHEN a.ManufacturerCountry = 'Germany' then 1 ELSE 0 END) as GermanyAccessoriesCount,
SUM(CASE WHEN a.ManufacturerCountry = 'Italy' then 1 ELSE 0 END) as ItalyAccessoriesCount
FROM [Accessories] a
WHERE a.CarId = c.Id AND a.[Year] > 1999) r
使用LINQ查询(EF核心)
我试过:
await this.context.Cars
.Take(10)
.Select(c => new
{
CarId = c.Id,
Accessories = this.context.Accessories.Where(a => a.CarId == c.Id && a.Year > 1999)
})
.Select(c => new
{
CarId = c.CarId,
FranceAccessoriesCount = c.Accessories.Count(a => a.ManufacturerCountry == "France"),
GermanAccessoriesCount = c.Accessories.Count(a => a.ManufacturerCountry == "Germany"),
ItalyAccessoriesCount = c.Accessories.Count(a => a.ManufacturerCountry == "Italy")
})
.ToListAsync();
但这不会产生外部应用。相反,它可以翻译为:
SELECT TOP(10) [c].[Id] AS CarId (
SELECT COUNT(*)
FROM [Accessories] AS [a]
WHERE (([a].[CarId] = [c].[Id]) AND [a].[Year] > 1999) AND ([a].[ManufacturerCountry ] = N'France')) AS [FranceAccessoriesCount ], (
SELECT COUNT(*)
FROM [Accessories] AS [a1]
WHERE (([a].[CarId] = [c].[Id]) AND [a1].[Year] > 1999) AND ([a1].[ManufacturerCountry ] = N'Germany')) AS [GermanyAccessoriesCount ], (
SELECT COUNT(*)
FROM [Accessories] AS [a2]
WHERE (([a2].[CarId] = [c].[Id]) AND [a2].[Year] > 1999) AND ([a2].[ManufacturerCountry ] = N'Italy')) AS [ItalyAccessoriesCount]
FROM [Cars] AS [c]
如何编写将在外部应用中转换的LINQ查询?EF是一个映射程序。您可以在定义实体时使用实体告诉它您想要什么,然后它会生成一条SQL语句来检索和投影该数据。它可能并非在所有情况下都是最佳的,但从性能角度来看,它通常是相当好的 如果EF查询没有返回您希望看到的数据,则从您希望投影到的所需数据接近它,并从您想要的投影与您得到的投影表达一个问题 如果EF查询返回您期望的数据,但没有像您期望的那样使用
交叉应用
,那么答案是,如果这很重要,不要依赖EF生成的查询,而是让它执行手工编制的SQL语句