为什么Null是无效的LINQ投影?

时间:2010-09-22 02:42:00

标签: c# linq

我有以下语句,它总是返回null:

var addins = allocations.SelectMany(
        set => set.locations.Any(q => q.IsMatch(level, count))
        ? (List<string>)set.addins : null
     );

我稍微改了一下,现在工作正常:

var addins = allocations.SelectMany(
        set => set.locations.Any(q => q.IsMatch(level, count))
        ? set.addins : new List<string>()
     );

我的主要问题:为什么在LINQ的这个上下文中,null不能作为三元运算符的返回类型?

第二个问题:是否有更聪明的方法来制定上述查询(特别是如果它消除了“新的List()”)?

2 个答案:

答案 0 :(得分:11)

Enumerable.SelectMany将尝试枚举lambda返回的序列,并抛出NullReferenceException尝试在null上调用GetEnumerator()。您需要提供实际的空序列。您可以使用Enumerable.Empty

,而不是创建新列表
var addins = allocations.SelectMany(
    set => set.locations.Any(q => q.IsMatch(level, count))
    ? (List<string>)set.addins : Enumerable.Empty<string>()
    );

我怀疑你真正想要的只是在SelectMany之前调用Where来过滤掉你不想要的集合:

var addins = allocations
    .Where(set => set.locations.Any(q => q.IsMatch(level, count)))
    .SelectMany(set => (List<string>)set.addins);

或者,在查询语法中:

var addins =
    from set in allocations
    where set.locations.Any(q => q.IsMatch(level, count))
    from addin in (List<string>)set.addins
    select addin;

答案 1 :(得分:1)

制作:

(List<string>)set.addins : (List<string>)null