我有一个linq查询,我在其中获取用户列表,之后我们通过用户ID过滤器获取记录。
var user = UserDal.GetAllUsers().First(n => n.UsersID == 1);
但是如果GetAllUsers()函数返回null应该怎么做?我们应该通过应用Any()来检查它吗?或其他什么?
答案 0 :(得分:3)
但是,如果GetAllUsers()函数返回null,该怎么办?
如果UserDal.GetAllUsers
返回null
,则您无法使用Any
,则必须针对null
进行检查。如果方法返回集合(甚至为空),则只能使用Any
或FirstOrDefault
。
如果方法可以返回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以防止空引用异常。