-1

は私のLINQクエリはLINQと生成されたSQL

var qry = from c in nwEntitiesContext.CategorySet.AsEnumerable() 
      let products = this.GetProducts().WithCategoryID(c.CategoryID) 
      select new Model.Category 
      { 
       ID = c.CategoryID, 
       Name = c.CategoryName, 
       Products = new Model.LazyList<Core.Model.Product>(products) 

      }; 
return qry.AsQueryable(); 

のようなものであると仮定し、私はちょうど私たちが実行したとき、それはVS2010のIDEから生成されたものを照会確認する方法....それは、実行時に生成されます問い合わせるかを知りたいですデバッグモードのコードは....私はステップごとにガイドします。あなたは、このようにメモリにCategoryテーブルからすべてのデータをフェッチAsEnumerableを呼び出すので、それだけでCategoryテーブルからすべてのフィールドを選択します -

答えて

2

はこちらを見て多くはありませんLinqpad

+0

linqパッドを使用しないと、生成されたSQLは表示されません。いつかのデータ検索が遅いので、ユーザーは間違いなくSQLが生成しているものを見たいと思っています。ご意見をお聞かせください。 – Mou

+0

@ user728750 - あなたは 'GetProducts()'のコードを表示していませんが、特定のcategoryIdを持つすべての製品を取得するEFクエリを作成している場合、** EVERY ** 'Category' DBに。 'AsEnumerable'を呼び出した後、あなたはオブジェクト空間にいます(EFはクエリを作成し、すべてのカテゴリを取得しました)。その後、あなたが何をするかによって、実際に直面しているパフォーマンスの問題を説明するすべてのカテゴリのDBクエリを作成することができます。 SQLレベルで何が起きているのかは、たとえば次のようにして確認できます。 SQLプロファイラ(私の答えを見てください)。 – Yakimych

3

を試してみてください。その後、オブジェクト空間にいます。さて、this.GetProducts()が何をするかによって、私の推測では、結果をメモリに取り込む別のEFクエリが作成されます。この場合、私はこのコードとあなたのGetProductsメソッドのコードで別の質問を投稿して、これをより最適な方法で見て書き直すことを強くお勧めします。 (これとは別に、マッピングされたエンティティModel.Categoryに投影していますが、Linq-to-Entitiesでは動作しません。)

クエリを読み込む前に、このようなことをすることをお勧めします:

string sqlQueryString = ((ObjectQuery)qry).ToTraceString(); 

しかし、もしあなたがLINQのツーオブジェクトとLINQのツーエンティティを混合しているので、それが動作しませんし、あなたが実際にケースGetProductsで実行される複数のクエリを持つことになりますがEFを照会します。あなたのEFクエリに一部を分離し、このかかわらずのようなSQLを見ることができます:

string sqlString = nwEntitiesContext.CategorySet.ToTraceString(); 

が、私は先に述べたように - ちょうどCategoriesテーブルからすべてを選択することになるという。

コードを徹底的に書き直さない限り、実際にコードを実行してクエリの結果を列挙するときに、DBに対して実行されるクエリを確認する必要があります。この質問をご覧ください: exact sql query executed by Entity Framework

選択肢はSQL Server ProfilerEntity Framework Profilerです。 LinqPadも試してみることができますが、一般的には、クエリがより詳細に何をしているのかを記述することをお勧めします(進行する前に、より最適な方法でそれらを書き換えることをお勧めします)。

+0

+1良い答え。正解とマークする必要があります。 –

0

これにより、SELECT * FROM Categoriesが生成されます。これ以上何もない。 AsEnumerableに電話すると、Linq-to-objectsにあり、Linq-to-entitiesに戻る方法はありません(AsQueryableはそうしません)。

生成されるクエリを確認するには、SQLプロファイラまたはthis articleに記載されている方法を使用します。

関連する問題