为什么我不能将Concat或Union结果转换为空列表?

ahs*_*ele 1 c# lambda

不幸的是,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)

所以我错过什么关于UnionConcat?他们为什么不在上述声明中工作?我理解为什么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).