我们有以下代码来检查数据库中是否存在给定的用户名和密码:
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查询以便我们可以处理空值?
由于
答案 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;
}
}