2011-06-23 15 views
2

LINQ to Entitesを使用して、従来のSQL ServerストアドプロシージャをEF4に変換するプロセスを進めています。あるシナリオで iが機能1 F1、機能2 F2及び関数3 F3は、テーブル変数を返す3つのSQLServer Table_Valued機能が どこLINQ TO ENTITIES複数のコレクションへの結合

Select * from Function1 F1 ,Function2 F2, Function3 F3 
where F1.ID = F2.ID and 
     F2.ID = F3.ID (i am showing it simple) 

ように3つの異なるTable_Valued機能 から選択ストアドプロシージャを持っています。

現在、私が今行っているのは、3つの異なるC#メソッド(これはSQLサーバー関数のものと同じ機能を模倣しています)を返すものです。コレクションを作成し、これら3つのコレクションをまとめて最終的な結果セットを取得します。

上記の解決策を使用すると、コードを一緒に呼び出すのではなく、データベースへの呼び出しを3回呼び出していると思いますので、代替ソリューションがありますか?

複数の呼び出しではなく、1つの大きなSQLを呼び出すコードを使用したいと思います。

ありがとうございました!

答えて

1

ここでの主な問題は、EFがテーブル値関数をサポートしていないことです。あなたのソリューションには別のひどい問題があります。関数をシミュレートする3つの.NET関数を使用すると、実際にはデータベースが3回呼び出されます(データベースへの3回の順次ラウンドトリップ)が、各関数の結果セット全体がアプリケーションにプルされ、アプリケーションサーバーのメモリに結合が実行されます。ほとんどの場合、これは受け入れられません。

おそらくlinq-to-entitiesまたはESQLに変換できるので、適切な解決方法は関数の内部実装に依存します。そうでなければ、ストアドプロシージャを使用することができます! EFのパブリック・シークレットは、ストアド・プロシージャを置き換えるものではありません。彼らはそれを使用するときにまだあなたの兵器の一部です。

+0

まあ私は、コレクションの代わりにIQueryableを返した場合、それらはすべて1つのSQLとして実行されると思いますか?メソッド1とメソッド2の両方が返ってくると思いますIQueryableと私はステートメントを書く場合、var1 = method2のmethod1のmethod1のm1からvar q = m1.Id == m2.ID m1.Nameを選択します。 int count = q.Count();最後の文はデータベース内の1つのSQLとして実行されるべきではありませんか? – user636525

+0

これはあなたの最初の記述とはかなり大きな違いです。 'IQueryable'はコレクションではありません。そのような場合は、あなたの方法がどのように書かれているかによって異なります。それらはデータベース上で実際に実行することができ、3つの結合はすべて単一のデータベース往復で評価できます。 SQLプロファイラを使用するか、最終的な 'IQueryable 'を 'ObjectQuery 'に変換し、 'ToTraceString'をチェックすることで、正確なクエリがどのようなものであるかを検証することができます –

+0

ありがとう!すべてのメソッドの戻り値をIQueryableに変更し、何が起こるかを確認します。以前はList を返していましたが、3つのコレクションに参加していました。 – user636525

関連する問題