0

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

例えば

関数への入力はキーのコレクションです。言う: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 つとして取っているため、コンパイルされません。上記を行うための回避策またはより良い方法はありますか?

4

1 に答える 1

0

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

これを達成する最も簡単な方法は、すべてをストアド プロシージャとして記述する (または DBA に記述させる) ことだと思いますが、これは、前述のスプリッタ関数を呼び出して、リストを引数の文字列として取得する必要があります。ストアド プロシージャの実行計画は、サーバーによって事前にコンパイルされます。

次のようなLinqを使用して、リストを文字列に簡単に作成できます

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

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

文字列にキャストできるもののリストを、文字列の IEnumerable に変換できます。

IEnumerable<string> strings = list.Cast<string>();

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

一般的なままにするために、Linq to SQL はリストを処理せず、渡すすべてのリストをリスト内の各エントリのパラメーターに変換することを思い出したようです。

于 2011-02-09T20:45:08.107 に答える