0

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

    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 查询以便我们可以处理空值?

谢谢

4

5 回答 5

2

您应该从 更改SingleSingleOrDefault,当没有数据匹配时它返回 null

context.UserEntities.SingleOrDefault(u => u.UserName == userName && 
                                          u.UserPassword == userPassword)
于 2012-09-25T10:19:00.453 回答
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 如果存在多个不符合条件的记录,将引发异常。

于 2012-09-25T10:19:14.457 回答
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
             }
            }
        }
于 2012-09-25T10:21:51.630 回答
1

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

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

if(user!=null)
{
 //do code
} 
于 2012-09-25T10:21:58.733 回答
1

使用SingleOrDefaultNull并在调用 Map 之前检查

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; 
    } 
} 
于 2012-09-25T10:22:30.120 回答