簡體   English   中英

實體框架查詢以生成預期的SQL

[英]Entity Framework query to generate SQL expected

我有兩個表AB AB是一對多的關系( A包含B集合)。

如何使Entity Framework生成下一個SQL(我應該寫什么linq查詢):

SELECT A.UserId, COUNT(B.ID) FROM A
LEFT JOIN B ON A.ID = B.A_ID
WHERE B.Score <= 6
GROUP BY A.UserId

我接下來嘗試過:

from a in db.A
join b in db.B 
on a.ID equals b.A_ID
where b.Score <= 6
group a by a.UserId into grouping
select new 
{
    UserId = (Guid) grouping.Key,                       
    RawValue = grouping.Sum(x => x.Bs.Count())
};

它返回了我所需的信息,但是EF將其轉換為可怕的查詢(這就是為什么此查詢的性能非常差的原因)。

生成的SQL:

SELECT 
1 AS [C1], 
[Project3].[UserId] AS [UserId], 
 CAST( [Project3].[C1] AS float) AS [C3]
FROM ( SELECT 
    [Project2].[UserId] AS [UserId], 
(SELECT 
    SUM([Filter2].[A1]) AS [A1]
    FROM ( SELECT 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[B] AS [Extent5]
            WHERE [Extent3].[ID] = [Extent5].[A_ID]) AS [A1]
        FROM  [dbo].[A] AS [Extent3]
        INNER JOIN [dbo].[B] AS [Extent4] ON [Extent3].[ID] = [Extent4].[A_ID]
        WHERE ([Extent4].[Score] <= 6) 
    )  AS [Filter2]) AS [C1]
FROM ( SELECT 
    [Distinct1].[UserId] AS [UserId]
    FROM ( SELECT DISTINCT 
        [Extent1].[UserId] AS [UserId]
        FROM  [dbo].[A] AS [Extent1]
        INNER JOIN [dbo].[B] AS [Extent2] ON [Extent1].[ID] = [Extent2].[A_ID]
        WHERE ([Extent2].[Score] <= 6) 
    )  AS [Distinct1]
)  AS [Project2]
)  AS [Project3]

預先感謝!

當我用

from a in db.A.DefaultIfEmpty()
        join b in db.B 
        on a.ID equals b.A_ID
        where b.Score <= 6
        group a by a.UserId into grouping
        select new 
        {
            UserId = (string) grouping.Key,                       
            RawValue = grouping.Count()
        };

我生成的SQL更改

SELECT 
        1 AS [C1], 
        [GroupBy1].[K1] AS [UserId], 
        [GroupBy1].[A1] AS [C2]
        FROM ( SELECT 
            [Extent1].[UserId] AS [K1], 
            COUNT(1) AS [A1]
            FROM    ( SELECT 1 AS X ) AS [SingleRowTable1]
            LEFT OUTER JOIN [dbo].[A] AS [Extent1] ON 1 = 1
            INNER JOIN [dbo].[B] AS [Extent2] ON [Extent1].[ID] = [Extent2].[A_ID]
            WHERE [Extent2].[Score] <= 6
            GROUP BY [Extent1].[UserId]
        )  AS [GroupBy1]

我認為這是非常好的優化結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM