不幸的是,SQL Server无法处理超过2100参数的参数列表.我有几个查询,当以批处理模式运行时超过此限制.为了仍然得到我想要的结果并快速循环数据集,我决定Skip(i).Take(2000)
在for循环中使用.
我没有准备好的是两者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;
Run Code Online (Sandbox Code Playgroud)
所以我错过什么关于Union
和Concat
?他们为什么不在上述声明中工作?我理解为什么AddRange可以工作,但是如果我关心我的结果的唯一性并希望使用该Union
怎么办?
Syn*_*siS 10
Union和Concat是纯粹的方法.它们不会修改它们运行的对象,而是返回一个副本.
var a = new [] {1, 2, 3, 4};
var b = new [] {5, 6, 7, 8};
var c = a.concat(b);
Run Code Online (Sandbox Code Playgroud)
此代码运行后
a => [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)
.