C# 无法从 lambda 表达式中获取类属性值
Posted
技术标签:
【中文标题】C# 无法从 lambda 表达式中获取类属性值【英文标题】:C# couldn't get class property value from lambda expression 【发布时间】:2022-01-15 20:28:22 【问题描述】:我正在使用 ASP.NET Core 5 和 Entity Framework Core 为我的 Web API 制作 CRUD 服务。我正在尝试创建一种方法,该方法通过其某些值从数据库中获取一个用户,这些值是使用 lambda 表达式选择的。问题是我无法获取与用户模型的值进行比较的类的属性值。
方法代码为:
public async Task<UserModel> FindOne(Expression<Func<UserModel, bool>> predicate)
var candidates = await _context.Users.Where(predicate).ToListAsync();
var user = candidates.First();
return user;
这是我如何调用FindOne
方法:
[HttpPost("register")]
public async Task<ActionResult<UserLoginResponseModel>> RegisterUser(UserRegisterRequestModel requestModel)
var model = new UserModel(requestModel);
var email = model.Email;
var candidate = await _service.FindOne(u => u.Email == email);
if (candidate is not null)
return BadRequest($"User with email model.Email is already registered");
// continuation of the code
我调试了我的程序,model.Email
在predicate
lambda 表达式中的值为:
value(.Constant<API.Controllers.UserController+<>c__DisplayClass4_0>(API.Controllers.UserController+<>c__DisplayClass4_0).model).Email
但如果我硬编码model.Email
的值,一切都会正常工作。
Entity Framework Core 版本:5.0.12
我不知道如何解决它。如果有人能帮助我,那就太好了。
【问题讨论】:
应该可以在没有任何额外操作的情况下工作。可能您在其他 lambda 表达式中使用此方法。所以,更好地展示用法。无论如何,为什么FirstAsync
不适合你?
@SvyatoslavDanyliv 这是该方法的唯一用途。 [HttpPost("register")] public async Task<ActionResult<UserLoginResponseModel>> RegisterUser(UserRegisterRequestModel requestModel) var model = new UserModel(requestModel); var candidate = await _service.FindOne(u => u.Email == model.Email); *continuation of the code*
我也尝试使用FirstAsync()
,但它也会抛出System.InvalidOperationException: Sequence contains no elements
。
调试器在使用 EF 和 Linq 时可能会很棘手。尝试使用string email = model.Email
和u => u.Email == email
提取字符串值。我猜该电子邮件在数据库中并不完全存在(它可能区分大小写或隐藏空格)。
所以使用FirstOrDefault
,当序列中没有记录时,这是正确的异常。
【参考方案1】:
答案是我必须使用FirstOrDefaultAsync()
而不是FirstAsync()
:
public async Task<UserModel> FindOne(Expression<Func<UserModel, bool>> predicate)
var user = await _context.Users.Where(predicate).FirstOrDefaultAsync();
return user;
感谢所有试图帮助我的人。
【讨论】:
以上是关于C# 无法从 lambda 表达式中获取类属性值的主要内容,如果未能解决你的问题,请参考以下文章