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.Emailpredicate lambda 表达式中的值为:

value(.Constant&lt;API.Controllers.UserController+&lt;&gt;c__DisplayClass4_0&gt;(API.Controllers.UserController+&lt;&gt;c__DisplayClass4_0).model).Email

但如果我硬编码model.Email 的值,一切都会正常工作。

Entity Framework Core 版本:5.0.12

我不知道如何解决它。如果有人能帮助我,那就太好了。

【问题讨论】:

应该可以在没有任何额外操作的情况下工作。可能您在其他 lambda 表达式中使用此方法。所以,更好地展示用法。无论如何,为什么FirstAsync 不适合你? @SvyatoslavDanyliv 这是该方法的唯一用途。 [HttpPost("register")] public async Task&lt;ActionResult&lt;UserLoginResponseModel&gt;&gt; RegisterUser(UserRegisterRequestModel requestModel) var model = new UserModel(requestModel); var candidate = await _service.FindOne(u =&gt; u.Email == model.Email); *continuation of the code* 我也尝试使用FirstAsync(),但它也会抛出System.InvalidOperationException: Sequence contains no elements 调试器在使用 EF 和 Linq 时可能会很棘手。尝试使用string email = model.Emailu =&gt; 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 表达式中获取类属性值的主要内容,如果未能解决你的问题,请参考以下文章

C# 编译器错误:无法转换 lambda 表达式

从 lambda 表达式中获取属性名称*没有*对象实例

从 HtmlHelper 的扩展方法中传递的 lambda 表达式中获取属性值的最简单方法是啥?

C# 10 Lambda 语法的改进

从 ASP.NET MVC Lambda 表达式中获取价值

从 C# 中的属性获取图像 URL