LINQ union带有可选的null第二个参数

时间:2011-02-28 15:50:46

标签: c# linq union

我有两个查询返回同一类对象的集合,在完成这两个查询后,我想将它们联合起来。

var results = from t in All()
              where t.Blah.Contains(blahblah)
              select t;

var results2 = from t in All()
               where t.blah2.contains(blahblah)
               select t;

return results.Union(results2);

可能第二个查询无法返回任何结果,并且为null

似乎我尝试与两者进行联合,如果第二个参数为null,它将抛出ArgumentNullException

显而易见的答案是在第二个查询上执行.ToList()以查看它是否包含任何内容。这个问题是我试图利用延迟执行,并且不想在此阶段实际执行数据库上的查询。

有什么方法吗?

编辑 - 解决方案

var results2 = from t in All()
        where t.blah2!=null && t.blah2.Contains(blahblah)
        select t;

基本上,当我尝试在空列表上执行包含时,实际查询返回null

感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

results2应该返回一个空列表,而不是null执行查询时。您拥有的代码不应该导致任何问题,并且在我能想到的所有情况下都可以正常工作。您能提供可能导致您尝试解决的问题的输入吗?

答案 1 :(得分:4)

以下问题无法解决您的问题吗?

return from t in All()
       where t.Blah.Contains(blahblah) && t.Blah2.Contains(blahblah)
       select t;

但是,如果resultsresults2需要保持独立,并且您希望将它们合并:

return results.Union(results2 ?? Enumerable.Empty<TResult>());

答案 2 :(得分:0)

var results = from t in All()
           where t.Blah.Contains(blahblah)
            select t;

var results2 = from t in All()
           where t.blah2.contains(blahblah)
             select t;

return (results2 != null || results2.Count() > 0) ? results.Union(results2) : results;

如果results2中有内容,则返回union,或者只返回第一个结果集。