检查Lambda中的Null

时间:2012-09-25 10:18:02

标签: c# linq lambda

我们有以下代码来检查数据库中是否存在给定的用户名和密码:

    public User GetUserByUserNameAndPassword(string userName, string userPassword)
    {
        using (var context = DataObjectFactory.CreateContext())
        {
            return Mapper.Map(context.UserEntities.Single(u => u.UserName == userName && u.UserPassword == userPassword));
        }
    }

如果我们在数据库中有用户名和密码,这可以正常工作,但如果用户名或密码错误且没有找到记录,则会抛出错误。

这可能很简单但是因为我是lambda的新手,所以无法做到正确。

如何更改lambda查询以便我们可以处理空值?

由于

5 个答案:

答案 0 :(得分:2)

您应该从Single更改为SingleOrDefault,当没有数据匹配时返回null

context.UserEntities.SingleOrDefault(u => u.UserName == userName && 
                                          u.UserPassword == userPassword)

答案 1 :(得分:2)

使用SingleOrDefault,它只返回一条记录,如果不存在则返回null。

return Mapper.Map(context.UserEntities.SingleOrDefault(u => u.UserName == userName && u.UserPassword == userPassword));

稍后您可以查看:

User returnedObject = GetUserByUserNameAndPassword(username,password)

if(returnedObject == null)
{
//User doesn't exist
}

如果符合条件的多条记录,则记住Single / SingleOrDefault会抛出异常。

答案 2 :(得分:1)

如果找到匹配的记录,

.Any()将返回true,如果未找到记录,则返回false。

因此,对现有代码稍作修改即可。

      public User GetUserByUserNameAndPassword(string userName, string userPassword)
        {
            using (var context = DataObjectFactory.CreateContext())
            {
             if (context.UserEntities.Any(u => u.UserName == userName && u.UserPassword == userPassword))
             {
                return Mapper.Map(context.UserEntities.Single(u => u.UserName == userName && u.UserPassword == userPassword));
             }
             else
             {
              //Deal with no user here through chosen method
             }
            }
        }

答案 3 :(得分:1)

使用FirstOrDefault或SingleOrDefualt并检查null,如下所示

var user =context.UserEntities.SingleOrDefault(u => u.UserName == userName 
                                           && 
                                           u.UserPassword == userPassword);

if(user!=null)
{
 //do code
} 

答案 4 :(得分:1)

使用SingleOrDefault并在调用地图

之前检查Null
public User GetUserByUserNameAndPassword(string userName, string userPassword) 
{ 
    using (var context = DataObjectFactory.CreateContext()) 
    { 
        var user = context.UserEntities.SingleOrDefault(u => u.UserName == userName && u.UserPassword == userPassword);
        return user !=null ? Mapper.Map(user) : null; 
    } 
}