C#Generic List.Any()抛出System.NullReferenceException

时间:2013-01-16 15:14:39

标签: linq entity-framework c#-4.0 generic-list

考虑以下部分视图代码段

List<sellingPrice> Prices = ViewBag.Prices;
foreach (var mgmp in mg.messageGroup.messageGroupMessagePLUs)
{
    if (Prices.Any(x => x.pluId == mgmp.messagePLU.plu.pluId))
    {
        //do stuff
    }
}

对于db中的特定产品,行

if (Prices.Any(x => x.pluId == mgmp.messagePLU.plu.pluId))

抛出System.NullReferenceException。检查代码显示mgmp 一个对象,而价格包含元素。但是,x的值为null。现在,我的印象是我只是测试是否存在满足我的测试的任何“x”,而不是要求它返回“x”。

这是一个非常恼人的问题。希望有人可以指出真正明显的解决方案。

3 个答案:

答案 0 :(得分:5)

尝试:

Prices.Any(x => x!=null && x.pluId == mgmp.messagePLU.plu.pluId)

如果例如.messagePLU可以为null

,则可能需要执行其他空检查

答案 1 :(得分:2)

发生这种情况的最可能原因是ViewBag.Prices中的一个或多个项目是null。检查x的{​​{1}},或者首先查看价格包含null的原因,假设它不应该包含任何null值。

答案 2 :(得分:0)

感谢大家的推理。 即使List为null,也检查list.Any()的扩展名。

    /// <summary>
    /// Determines whether the collection is null or contains no elements.
    /// </summary>
    /// <typeparam name="T">The IEnumerable type.</typeparam>
    /// <param name="enumerable">The enumerable, which may be null or empty.</param>
    /// <returns>
    ///     <c>true</c> if the IEnumerable is null or empty; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNullOrEmpty<T>(this ICollection<T> enumerable)
    {
        return enumerable != null && enumerable.Count > 0;
    }