Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF LINQ查询到SQL外部应用_Entity Framework_Linq_Entity Framework Core - Fatal编程技术网

Entity framework EF LINQ查询到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

如何生成这样的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 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语句