2012-02-07 15 views
7

クエリパフォーマンスを賢明に書くにはどのような方法が最適ですか。例えば私は、私の質問はこのことである従うEntity Frameworkでクエリを作成する最適な方法は何ですか

ObjectQuery<Employee> queryEmp = 
    context.CreateQuery<Employee>(
    "Select value e from Employees AS e Where e.LastName = @lastName", 
    new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" }); 
ObjectResult<Employee> results = query.Execute(MergeOption.AppendOnly); 

OR

var v = from e in context.Employees where e.LastName == "Farooqi" select e; 

OR

context.Employees.Where(e => e.LastName == "Farooqi"); 

OR

context.Employees.Where("LastName = @lastName", new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" }); 

として、特定の姓のすべてのemployesを取得するクエリを書くことができますどの問合せ方法が最適です。 私は混乱していますが、最初のもの以外の最後の3つのメソッドを使用すると、データベースから従業員のすべてのレコードがフェッチされ、指定されたwhere条件を満たすreturenedされるすべてのレコードが列挙されると思います私は最後の3つの方法は、最初のものよりも時間がかかるので、私は最初のものだけを使用したと思います。 しかし、私は知らない実際には最高のものは何ですか? すべてのメソッドは、条件を満たしているレコード・フォーム・データベースのみをフェッチしますか、またはデータベースからすべてのレコードをフェッチし、アプリケーション終了時にフィルタリングされたレコードを戻すように列挙しますか?

答えて

9

ほとんど違いはありません。 LastNameが存在しないか、またはintである場合に式ツリーがコンパイルされないので、第2 /第3はコンパイル時に型の正確さを強制する利点があります。これはタイプミスや "マジックストリング"の問題を避けます。

すべてのものを取り戻すことについてのあなたの仮定。いいえ。 2番目と3番目はの式ツリーにコンパイルされ、正しいSQL(サーバーでフィルタを実行する)を作成するために使用できます。非常に巧妙ですが、しばしば誤解されます。重要な点は、これはQueryable.WhereExpression<Func<T, bool>>を取る)であり、Enumerable.WhereFunc<T, bool>を取る)ではないことです。自由にトレースを実行してください。

同様に、1番目と4番目の間にはほとんど違いがありません。どちらもサーバーでフィルタリングされます。

関連する問題