3

Entity Frameworkモデルからデータを抽出する方法に応じて、さまざまな種類の結果が得られます。私は、ナビゲーションプロパティを使用している場合Entity Framework - ObjectContextからのクエリとナビゲーションプロパティからのクエリの比較

var employees = MyObjectContext.Employees.Where(e => e.DepartmentId == MyDepartment.Id && e.SomeCondtition) 

しかし:私はのObjectContextから直接引いた場合、私は実際にSystem.Data.Objects.ObjectQuery<Employee>あるIQueryable<Employee>を取得

:たとえば、特定の部門の従業員のリストを取得するとき私は頻繁にを使用し、次のコードでは

var employees = MyDeparment.Employees.Where(e => e.SomeCondtition) 

:MyDepartment、私は実際にSystem.Linq.WhereEnumerableIterator<Employee>(System.Linq.Enumerableでプライベートクラス)である、IEnumerable<Employee>を取得しますいくつかのLINQクエリ(WhereOrderByFirstSumなど)

私は考慮に入れれるべき私が使用しているクエリ方法で?パフォーマンスの違いはありますか?後者は遅延実行を使用していますか?一つのより良い練習ですか?それとも違いがないのでしょうか?後者の方法を使用した場合、どれも直接クエリを使用していないとき

私はIEnumerableを警告の可能な複数の列挙のこの整形6をインストールするので、私は取得していますので、多くを尋ねます。私は後者の方法をもっと頻繁に使ってきました。なぜなら、書くのがはるかに洗練されているからです。そうした方が実際に有害な影響を与えているのだろうかと思います。

答えて

2

非常に大きな違いがあります。

IQueryable = exression treeの場合、他の式を追加することはできますが、クエリを実行する(遅延実行)ときのみ、式ツリーはSQLに変換され、データベースで実行されます。したがって、最初の例を使用して.Sumを追加すると、実際にデータベースで操作が実行され、単一の番号だけがアプリケーションに転送されます。それはlinq-to-entitiesです。

2番目の例では、メモリコレクションを使用しています。ナビゲーションプロパティがIQueryable(式ツリー)を表していません。すべてのlinqコマンドはlinq-to-objects =ナビゲーションプロパティの関連データを表すすべてのレコードを最初にデータベースからアプリケーションにロードする必要があり、すべての操作はアプリケーションサーバーのメモリ内で行われます。ナビゲーションプロパティを(Includeを使用して)慎重に(Loadを使用して)、遅延してロードすることができます(レイジーロードが有効な場合は初めてプロパティにアクセスするときに自動的に行われます)。したがって、何かを合計したい場合、このシナリオでは、データベースからすべてのデータをロードし、ローカルで操作を実行する必要があります。

+0

ありがとうございます。このコンテキストで使用すると、ナビゲーションプロパティを完全に避ける必要がありますか?または、列挙可能なナビゲーションプロパティでCreateSourceQuery()を呼び出すことと同じになりますか? – Ross

+0

'CreateSourceQuery'を使うともう一度IQueryableを使います。これはOKです。ナビゲーションプロパティ自体はクエリ用ではありません。それらは関連するオブジェクトを扱うためのものです。 –

+0

ナビゲーションプロパティはフィルタリングのための準拠クエリよりも利点がありますか? – ManirajSS

関連する問題