2012-02-17 9 views
1

残念ながら、SQL Serverは2100パラメータを超えるパラメータリストを処理できません。私は、バッチモードで実行するとこの制限を超えるいくつかのクエリを持っています。それでも私が望む結果を得るために、データセットをすばやく循環させるために、私はSkip(i).Take(2000)をforループで使用することに決めました。なぜ、連合または連合の結果を空のリストにできないのですか?

私が準備していなかったのは、UnionConcatの両方が、ただインスタンス化されたばかりのものではないことが、IEnumerableにあることです。確かにそれは空ですが、私は彼らの使い方について何か基本的なものを見逃しているに違いありません。とにかく、問題を解決するために、リストとAddRangeを使用して終了しました。私はNHibernateを使用していますが、なぜUnionConcatが機能していないのかを考える必要はありません。

var machineResults = new List<Machine>(); 

for (int i = 0; i < machines.Count(); i += 2000) 
{ 
        // I would have expected Union or Concat to work here 
    machineResults.AddRange(GetSession().CreateQuery(
     @"select distinct m 
     from Machine m 
     where m in (:MachinesList)") // there's more criteria than this 
     .SetParameterList("MachinesList", 
          machines.Skip(i).Take(2000).ToList()) 
     .List<Machine>());     
} 

return machineResults; 

は、だから私はUnionConcatについて何をしないのですか?なぜ彼らは上記の声明の中で働かないのですか?私はAddRangeがなぜ機能するのか理解していますが、結果の一意性が気になり、Unionを使いたかったのですが?

答えて

9

ユニオンとコンカットは純粋な方法です。実行されているオブジェクトは変更されず、コピーが返されます。このコードは

を実行した後

var a = new [] {1, 2, 3, 4}; 
var b = new [] {5, 6, 7, 8}; 

var c = a.concat(b); 

=> [1、2、3、4] B => [5、6、7、8] C => [1、2、 3,4,5,6,7,8]

machineResults.concat(x)があった場合、実際にはmachineResultsコレクションは変更されていません。代わりにmachineResults = machineResults.concat(x)が必要です。

+0

Doh!私の記憶をジョギングしてくれてありがとう。遅いです、私は寝るつもりです。 – ahsteele