不幸的是,SQL Server无法处理超过2100个参数的参数列表。我有几个查询,当以批处理模式运行时超过此限制。为了仍然得到我想要的结果并快速遍历数据集,我决定在for循环中使用Skip(i).Take(2000)
。
我没有做好准备,Union
和Concat
要求IEnumerable
不仅仅是实例化才能工作。当然它是空的,但我必须遗漏一些关于它们使用的基本信息。无论如何,为了解决这个问题,我最终使用了List和AddRange
。我正在使用NHibernate,但不要认为Union
和Concat
无效的因素。
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;
那么我对Union
和Concat
缺少什么?他们为什么不在上述声明中工作?我理解为什么AddRange有效,但如果我关注结果的唯一性并希望使用Union
怎么办?
答案 0 :(得分:10)
Union和Concat是纯粹的方法。他们不会修改他们运行的对象,而是返回一个副本。
var a = new [] {1, 2, 3, 4};
var b = new [] {5, 6, 7, 8};
var c = a.concat(b);
此代码运行后
a =&gt; [1,2,3,4] b =&gt; [5,6,7,8] c =&gt; [1,2,3,4,5,6,7,8]
如果您有machineResults.concat(x)
,则意味着您实际上并未修改machineResults集合。相反,你必须拥有machineResults = machineResults.concat(x)
。