2016-10-27 8 views
1

私はGuid?を返すメソッドを持っています。 matching Id from tableを取得するには2つの方法があります。一致する行のIDを取得しています - 2つのアプローチのパフォーマンス差はありますか?

1-どのような方法が好まれているのか、それともその人だけの好みですか?
2パフォーマンスの違いはありますか?

private Guid? findCustomerId(string customerNo) 
{ 
    // 1st way 
    return _context.Customers.FirstOrDefault(x => x.Code == customerNo).Id; 

    // 2nd way 
    return _context.Customers.Where(x => x.Code == customerNo).Select(y => y.Id).FirstOrDefault(); 

} 
+0

最高の提案は、生成されたSQLをチェックして比較することです。同じかもしれません –

+0

生成されたSQLを検査するためのツール - Entity Framework Profilerなどがあります。私は両方のステートメントが同じSQLを生成すると期待しますが、出力を見ることに興味があります。 –

+0

あなたはSQLプロファイラについて話していますか? Entity Profilerについて聞いたことがありません! – simbada

答えて

1

両方のアプローチは、同じSQLを生成が、1つの差に - 列は、1つの選択された行の返すように:あなたはあなたができる生成されたSQLから列を削除した場合

// 1st way - Returns entire record to memory and then you decide to take just ID 
return _context.Customers.FirstOrDefault(x => x.Code == customerNo).Id; 

// 2nd way - Returns just the column of ID to memory 
return _context.Customers.Where(x => x.Code == customerNo).Select(y => y.Id).FirstOrDefault(); 

を彼らが同じことをしているのを見てください。

//Approach 1: 
SELECT [Limit1].[Id] AS [Id] 
FROM (SELECT TOP (1) * 
     FROM [dbo].[Customers] AS [Extent1] 
     WHERE ([Extent1].[Code] = @p__linq__0) 
     OR (([Extent1].[Code] IS NULL) AND (@p__linq__0 IS NULL)) 
    ) AS [Limit1] 



//Approach 2: 
SELECT TOP (1) *  
FROM [dbo].[Customers] AS [Extent1] 
WHERE ([Extent1].[Code] = @p__linq__0) 
OR (([Extent1].[Code] IS NULL) AND (@p__linq__0 IS NULL)) 
  1. 両方のクエリが
  2. WHERE句はあなたがいない場合は最初のアプローチでは、ネストされたSELECTは、パフォーマンス上の影響

を持っていない

  • 同じですTOP (1)レコードを取得cricitalのパフォーマンスに問題がある(または、あなたの列に巨大なフィールが含まれている場合データのds)は、すべてのレコードを取得することによって引き起こされる読みやすさのために行く - と私の意見では、最初の方法はより読みやすいです

    +0

    あなたはどちらも同じSQLを生成していますか?私はプロファイリングを行い、両方が異なるSQLを生成することを発見しました。私の更新された答えを見てください。 – simbada

    +0

    @simbada - アップデート –

    +0

    を参照パフォーマンスは問題です。だから私は2番目のアプローチに行くだろう。私はそれらを必要としないときにすべての列を返す必要はありません。最初のアプローチのネストされたSELECTはパフォーマンスに影響を与えませんまたはパフォーマンスの影響は最小限です。私は最小だと思う。 – simbada

    関連する問題