C# 为什么我不能将Concat或Union结果添加到空列表中?

C# 为什么我不能将Concat或Union结果添加到空列表中?,c#,lambda,C#,Lambda,遗憾的是,SQL Server无法处理超过2100个参数的参数列表。我有几个查询在批处理模式下运行时超过了这个限制。为了仍能得到我想要的结果并快速遍历数据集,我决定在for循环中使用Skipi.Take2000 我没有准备好的是,Union和Concat都需要一个IEnumerable,而不仅仅是实例化才能工作。当然,这是一个空的,但我肯定错过了一些基本的使用。无论如何,为了解决这个问题,我最终使用了List和AddRange。我正在使用NHibernate,但不要认为这就是为什么Union和C

遗憾的是,SQL Server无法处理超过2100个参数的参数列表。我有几个查询在批处理模式下运行时超过了这个限制。为了仍能得到我想要的结果并快速遍历数据集,我决定在for循环中使用Skipi.Take2000

我没有准备好的是,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;

那么,关于工会和康卡特,我遗漏了什么呢?为什么他们不在上面的陈述中工作?我理解AddRange的工作原理,但如果我担心结果的唯一性,想使用Union呢?

Union和Concat是纯方法。它们不会修改运行它们的对象,而是返回一个副本

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

var c = a.concat(b);
在这个代码运行之后

a=>[1,2,3,4] b=>[5,6,7,8] c=>[1,2,3,4,5,6,7,8]


也就是说,如果您有machineResults.concatx,那么您实际上并没有修改machineResults集合。相反,您必须使用machineResults=machineResults.concatx.

Doh!谢谢你唤起我的记忆。很晚了,我要睡觉了。