如何处理null linq查询结果?

时间:2014-05-06 13:07:57

标签: c# linq

我有一个linq查询,我在其中获取用户列表,之后我们通过用户ID过滤器获取记录。

var user = UserDal.GetAllUsers().First(n => n.UsersID == 1);

但是如果GetAllUsers()函数返回null应该怎么做?我们应该通过应用Any()来检查它吗?或其他什么?

4 个答案:

答案 0 :(得分:3)

  

但是,如果GetAllUsers()函数返回null,该怎么办?

如果UserDal.GetAllUsers返回null,则您无法使用Any,则必须针对null进行检查。如果方法返回集合(甚至为空),则只能使用AnyFirstOrDefault

如果方法可以返回null,则:

var temp = UserDal.GetAllUsers();
if(temp != null)
{
   var user = temp.FirstOrDefault(n=> n.UserID == 1);
}

如果您的方法可以返回空集合而不是null,那么您可以执行以下操作:

var user = UserDal.GetAllUsers().FirstOrDefault(n => n.UsersID == 1);

您应该修改方法UserDal.GetAllUsers以不返回null。如果没有记录,则应返回空集合。

答案 1 :(得分:2)

为什么不简单地检查它是否为空?

var users = UserDal.GetAllUsers();

if (users == null || !users.Any())
{
    // handle error
}

var user = users.First(x => x.Id == someId);

但是,如果你控制了代码库,我肯定会说你应该这样做GetAllUsers永远不会返回null

答案 2 :(得分:0)

您可以使用[DefaultIfEmpty]并将该实例用作默认值:处理空值

答案 3 :(得分:0)

你可以使用Monads,例如https://github.com/sergun/monads.net

或者您可以实现自己的扩展方法。 此代码根据原始扩展方法进行了调整,并返回默认值(T),而不是抛出异常。

// UserDal.GetAllUsers() returns null and user is null
var user = UserDal.GetAllUsers().MyFirstOrDefault(n => n.UsersID == 1);

public static class IEnumerableExtensions
{
    public static T MyFirstOrDefault<T>(this IEnumerable<T> source, 
         Func<T, bool> predicate)
    {
        if (source == null) return default(T);
        if (predicate == null) return default(T);

        foreach (T element in source)
        {
            if (predicate(element)) return element;
        }
        return default(T);
    }
}

或者您可以使用空检查或确保在使用标准扩展方法时永远不会返回null以防止空引用异常。