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

时间:2012-02-17 06:35:53

标签: c# lambda

不幸的是,SQL Server无法处理超过2100个参数的参数列表。我有几个查询,当以批处理模式运行时超过此限制。为了仍然得到我想要的结果并快速遍历数据集,我决定在for循环中使用Skip(i).Take(2000)

我没有做好准备,UnionConcat要求IEnumerable不仅仅是实例化才能工作。当然它是空的,但我必须遗漏一些关于它们使用的基本信息。无论如何,为了解决这个问题,我最终使用了List和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怎么办?

1 个答案:

答案 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)