2011-02-08 14 views
0

linqからsqlクエリのいずれかのコンパイル済みクエリを使用しようとしています。このクエリには、5〜6個の結合が含まれます。私はコンパイルされたクエリを作成することができましたが、私が直面している問題は、キーが入力として渡されたキーのコレクション内にあるかどうかを照会する必要があることです。しかし、コンパイルされたクエリはコレクションの渡しを許可しません(コレクションにはアイテム数が異なるため、許可されないため)。linq to sqlコンパイル済みクエリのヘルプ

たとえば、

は、キーのコレクションです。セイ:List<Guid> InputKeys

List<SomeClass> output = null; 
    var compiledQuery = CompiledQuery.Compile<DataContext, List<Guid>, IQueryable<SomeClass>>(
         (context, inputKeys) => from a in context.GetTable<A>() 
            where inputKeys.Contains(a.Key) 
            select a); 

    using(var dataContext = new DataContext()) 
    { 
      output = compiledQuery(dataContext, InputKeys).ToList(); 
    } 

    return output; 

それは入力の1つとしてリストを取っているので、上記のクエリはコンパイルされません。上記を行うための回避策や改善策はありますか?

+0

コンパイル済みのクエリではなく、通常のクエリを使用できますか? – Gabe

+0

@Gabe:できました。しかし、私が言及したように、それは複雑なクエリであり、毎回コンパイルするコストを排除できるかどうかを確認したい。ありがとう。 – stackoverflowuser

答えて

0

Linq to SQLだけを使ってこれが可能であるかどうかはわかりません。私はあなたのリストを表す区切られた文字列を渡すことができるストアドプロシージャまたは関数をサーバー上に書く必要があり、それを比較してテーブルを返すことを解析すると思います。

私はこれを達成する最も簡単な方法は、上記のスプリッタを呼び出して、あなたのリストを引数の文字列として取る必要があるストアドプロシージャとして全体を書くこと(またはあなたのDBAの書き込みをすること)関数。ストアド・プロシージャは、その実行計画がサーバーによってプリコンパイルされます。

あなたは簡単にあなたが

IEnumerable<string> strings = list.Cast<string>(); 
で文字列のIEnumerableをに文字列にキャストできるもののリストを有効にすることができます

string[] strings = new string[4] { "1", "2", "3", "4" }; 

string listOfStrings = strings.Aggregate((acc, s) => acc = acc + ", " + s); 

ようなものでLINQのを使用して文字列にあなたのリストを作ることができます

dbmlファイルにストアドプロシージャを追加し、Linq to SQLを使用してストアドプロシージャを呼び出すことができます。

私は、LinqをSQLにすることは、一般的なままにするために、物のリストを扱わず、渡すすべてのリストをリストの各エントリのパラメータに変換することを思い出しています。