【问题标题】:How can I use a lambda function in the FindAsync() method?如何在 FindAsync() 方法中使用 lambda 函数?
【发布时间】:2021-03-19 09:35:25
【问题描述】:

我想找到符合特定要求的对象。在这种情况下,我希望 Course 类的 className 属性等于“course”。我想使用的语句是:

Course matchingCourse = collection.FindAsync(x => x.className == "course");

className属性不是主键,所以不能简单的把键放进去。

由此我得到错误“无法将 lambda 表达式转换为类型 'object',因为它不是委托类型”。我环顾四周,无法弄清楚如何在这种情况下解决问题。

如何使用 lambda 来执行我在 FindAsync() 中尝试执行的操作,或者有其他方法吗?

【问题讨论】:

    标签: c# asp.net entity-framework linq entity-framework-core


    【解决方案1】:

    您可以使用Where 后跟FirstOrDefaultSingleOrDefault,或者只将谓词传递给它们,除非您需要Find 提供的缓存。这将每次调用数据库。 Find 仅适用于主键。

    例如:

    Course matchingCourse = collection.FirstOrDefault(x => x.className == "course");
    

    对于异步:

    Course matchingCourse = await collection.FirstOrDefaultAsync(x => x.className == "course");
    

    【讨论】:

      【解决方案2】:

      FindSelect 之间的主要区别在于,Find 将首先检查您想要的对象是否在您创建 DbContext 之后已经被获取。 Select 将始终从数据库中获取数据。

      其实用的是Find,如果你取了一个对象,丢失了对它的引用,又想要取到的对象,而不是原来的。

      通常,让 DbContext 长时间保持活动状态并不是一个好主意,因此您丢失对所获取对象的引用的可能性非常小。

      因此我的建议是使用 Select 来获取项目:

      (省略异步,不是您的问题的一部分)

      var result = collection
          .Where(collectionElement => collectionElement.ClassName == "course")
          .FirstOrDefault();
      

      如果您确实需要获取较早获取的项目,可以使用DbContext.ChangeTracker.Entries<...>() 并在已获取的对象上执行Where(...)

      【讨论】:

        猜你喜欢
        • 2014-05-06
        • 2017-09-08
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2019-02-08
        • 1970-01-01
        • 2016-11-13
        • 2020-08-06
        相关资源
        最近更新 更多