2016-08-03 22 views
0

SQLテーブルから読み込むLinqクエリがあり、そのうちの1つが(C#の)カスタム関数のものです。以下のようなLinq:メソッドにはSQLへの変換がサポートされていませんが、メモリにダンプする方法はありますか?

何か:私はLinqPadでq.Dump()を行う場合

var q = from my in MyTable 
     select new 
     { 
      ID = my.ID, 
      Amount = GetAmount(ID) 
     }; 

が、それは結果を示し、それはSQLにそれを送信しようとせずにカスタム関数を実行することを私に語りました。 Method has no supported translation to SQLというエラーが出る

var q1 = (from p in AnotherQuery.Union(q)... 

とI:

は今、私は、別のクエリに組合にこれをしたいです。

私のロジックはqをメモリにダンプしてからそれに結合する必要があることを示しています。私はToList()でそれをやろうとしていて、リストからそれ自身を読み込むセカンダリクエリを作成しましたが、それはさまざまなエラーの長いリストにつながります。私は正しい軌道に乗っているのですか?それを記憶と組合でqにしようとしているのですか、これを行うより良い方法がありますか?

+0

sqlにlinkPadを設定しましたか? EFと? –

+0

特定のEF構成はありません。SQLへの接続を追加し、LinqPadをC#プログラムとして実行しました。 –

+0

あなたのDBに対してリンクを実行するには、EF設定を読み込む必要があります。 –

答えて

1

変換されたLINQクエリでカスタム関数を使用することはできません。指定されたLINQプロバイダでサポートされている関数のみが使用できます。サーバー上でクエリを実行するには、サポートされている関数を使用する必要があります(たとえそれ以外の場合に再利用されるコードをインライン化する必要がある場合もあります)。

2つのクエリの違いは、投影がいつ起こるか(そしてどこで発生するか)です。あなたの最初のケースでは、MyTableのデータがDBから返されます - あなたのサンプルでは、​​IDだけです。次に、この上に投影が発生します - GetAmountメソッドがIDのそれぞれのアプリケーションで呼び出されます。

一方、最後の予測でGetAmountを使用していないため、2番目のクエリでこれが発生するような方法はありません。

カスタム関数をインラインクエリで置き換える必要があります。プロバイダーは、メモリ内で行う必要があるものだけでなく、サポートされている関数を使用するためにすべてのクエリを理解またはリファクタリングします。 実際のクエリに完全に依存するため、サンプルコードを与えることには意味がありません。また、実際にクエリを実行しようとしているものです。

+0

ありがとうございます。私は、正確なコードを与えることなく、あなたは正確な答えを提供することができないことに同意します。しかし、ToList()にすべてを渡してから、それをUnionに送ってみると、それは一番うまくいくようです。ありがとう。 –

+0

@CameronCastilloごくわずかなデータがあれば最適です。 'ToList'sによって返されるデータが大きくなることを期待するなら、とにかくすべてをやり直す必要があります。 – Luaan

関連する問題