0

次のコードがあるとしましょう(パフォーマンスを向上させるために簡単に変更できることはわかっていますが、それは私がやりたいことを示しています)

List<Query> l = new List<Query>; 
// Query is a class that doesn't exist, it represents an EF operation

foreach (var x in Xs)
{
  Query o = { context.someEntity.Where(s=>s.Id==x.Id).First();} 
  // It wouldn't execute it, this is pseudo code for delegate/anonymous function
  l.Add(o)
}

次に、このクエリのリストをEFに送信し、可能な限り最小のラウンドトリップを実行するように最適化します。それをBatchOptimizeAndRunと呼びましょう。あなたは言うだろう

var results = BatchOptimizeAndRun(l);

そして、スキーマから何を知っているかを知ることで、クエリ全体を最適なバージョンに減らし、それを実行して、読み取った結果を配列に配置します。

私が探しているものを正確に、そしてもっと重要なことに、それが存在することを説明したことを願っています。そして、私がとりとめのない狂った男のように聞こえるなら、この質問が決して存在しなかったふりをしましょう。

4

1 に答える 1

2

I'd have to echo Mr. Moore's advice, as I too have spent far too long constructing a linq-to-entities query of monolithic proportions only to find that I could have made a stored procedure in less time that was easier to read and faster to execute. That being said in your example...

List<int> ids = Xs.Select(x => x.Id).ToList();
var results = context.someEntity.Where(s => ids.Contains(s.Id)).ToList();

I believe this will compile to something like

SELECT
    *
FROM
    someEntity
WHERE
    Id IN (ids) --Where ids is a comma separated list of INT

Which will provide you with what you need.

于 2012-05-08T02:35:21.133 に答える