3

メソッドを使用すると、EntityFrameworkで非効率的なクエリが生成されることに気づきましたFind()。たとえば、これが私のC#コードです。

Model model = unit.Repository.DbSet.Find(model.ID);

Find()クエリを生成する

DECLARE @p0 int = 1

SELECT 
[Limit1].[ID] AS [ID], 
[Limit1].[UserID] AS [UserID], 
[Limit1].[Started] AS [Started], 
[Limit1].[Updated] AS [Updated], 
[Limit1].[Completed] AS [Completed]
FROM ( SELECT TOP (2) 
        [Extent1].[ID] AS [ID], 
        [Extent1].[UserID] AS [UserID], 
        [Extent1].[Started] AS [Started], 
        [Extent1].[Updated] AS [Updated], 
        [Extent1].[Completed] AS [Completed]
        FROM [dbo].[Table] AS [Extent1]
        WHERE [Extent1].[ID] = @p0
)  AS [Limit1]

不要な他のすべてのselectクエリを実行しているようです。SingleOrDefault()メソッドを使用した出力は次のとおりです。

SingleOrDefault()クエリを生成する

DECLARE @p__linq__0 int = 1

SELECT TOP (2) 
[Extent1].[ID] AS [ID], 
[Extent1].[UserID] AS [UserID], 
[Extent1].[Started] AS [Started], 
[Extent1].[Updated] AS [Updated], 
[Extent1].[Completed] AS [Completed]
FROM [dbo].[Table] AS [Extent1]
WHERE [Extent1].[ID] = @p__linq__0

Find()2つの選択を生成する理由はありますか?Find()その方法を支持してその方法を避けるべきSingleOrDefault()ですか?

4

1 に答える 1

2

少なくともSQLサーバーの場合、2つの間にパフォーマンスの違いがあるとは思えません。最初のものは、選択の周りに余分なラッパーがあるように見えます。私が持っているデータベースで同様のクエリを実行すると、まったく同じプランが生成されるため、実行プランで外部選択が最適化されると思います。

于 2012-07-05T16:36:20.543 に答える