0

我正在尝试创建一个 linq 查询,它为我提供了一个列表,其中包含来自主表的数字列以及详细记录的计数。我的问题是 linq 吐出一个没有外部应用的查询,这使得查询需要 15 秒。如果我自己使用外部应用创建 SQL,则相同的查询需要不到一秒钟的时间。

TekMas.Select(x => new {x.TekNr,Cnt = x.TekRev.Count})

这将创建以下 sql

SELECT 
    [Extent1].[TekMasID] AS [TekMasID], 
    [Extent1].[TekNr] AS [TekNr], 
    (SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[TekRev] AS [Extent2]
        WHERE [Extent1].[TekMasID] = [Extent2].[TekMasID]) AS [C1]
    FROM [dbo].[TekMas] AS [Extent1]

我正在尝试使用 linq 创建以下 SQL

SELECT  TekMas.TekNr, RevCnt.Cnt
FROM    TekMas
            OUTER APPLY ( SELECT    COUNT (TekRevID) AS Cnt
                                        FROM    TekRev
                                        WHERE TekRev.TekMasID = TekMas.TekMasID) RevCnt;

我知道我可以只使用这样的第一个详细记录来创建外部应用

TekMas.Select(x => new { x.TekNr, Cnt = x.TekRev.FirstOrDefault() })
.Select(x => new { x.TekNr, x.Cnt.TekRevID, x.Cnt.TekRevInf })

此 linq 创建以下 SQL 结果

SELECT 
    [Extent1].[TekMasID] AS [TekMasID], 
    [Extent1].[TekNr] AS [TekNr], 
    [Limit1].[TekRevID] AS [TekRevID], 
    [Limit1].[TekRevInf] AS [TekRevInf]
    FROM  [dbo].[TekMas] AS [Extent1]
    OUTER APPLY  (SELECT TOP (1) 
        [Extent2].[TekRevID] AS [TekRevID], 
        [Extent2].[TekRevInf] AS [TekRevInf]
        FROM [dbo].[TekRev] AS [Extent2]
        WHERE [Extent1].[TekMasID] = [Extent2].[TekMasID] ) AS [Limit1]

是否有一种解决方案可以强制 linq 在使用 count 时创建外部应用,就像在上一个示例中对 FirstOrDefault() 所做的那样

谢谢斯蒂芬

4

0 回答 0