List<Model> 不包含定义 SingleOrDefaultAsync 和可访问的扩展方法

Posted

技术标签:

【中文标题】List<Model> 不包含定义 SingleOrDefaultAsync 和可访问的扩展方法【英文标题】:List<Model> doesn't contain definition SingleOrDefaultAsync and accessible extension method 【发布时间】:2022-01-21 09:06:04 【问题描述】:

当我尝试使用 SingleOrDefaultAsync 将单个记录导入模型时,它显示错误

List 不包含定义 SingleOrDefaultAsync 和可访问的扩展方法

public class MemoryRepository 

    private List<Genre> _genres;
    public MemoryRepository() //Constructor
    
        _genres = new List<Genre>()
         new Genre()Id=1,GenreName="Comedy",
          new Genre()Id=2,GenreName="Action"
        ;
    
    

    public async  Task<Genre> GetGenreById(int Id)
    
       return await  _genres.SingleOrDefaultAsync(x => x.Id == Id);
    

【问题讨论】:

【参考方案1】:

SingleOrDefaultAsync 和类似的~Async 方法来自 Entity Framework Core,可用于异步查询数据库。它们在使用 IQueryable 时使用,这是一种抽象,表示“可以查询的东西”。

Lists 和其他内存中的集合(例如数组)是不可可查询的,因为对它们的操作是通过使用集合本身来进行的。相反,它们是可枚举的,实现了IEnumerable,这使得它们可以与标准的同步 LINQ 方法一起使用。

所以你可以在这里使用同步的SingleOrDefault 而不是异步的SingleOrDefaultAsync。这也意味着您不再需要等待结果,并且方法也可以同步返回:

// return type is changed to reflect a synchronous result
public Genre GetGenreById(int Id)

   return _genres.SingleOrDefault(x => x.Id == Id);

如果您需要您的方法仍然返回 Task&lt;Genre&gt;(例如,如果您需要实现一个用于异步使用的接口),那么您可以使用 Task.Result 将您的同步结果包装在一个任务中:

// note that there is no `async` here
public Task<Genre> GetGenreById(int Id)

   return Task.FromResult(_genres.SingleOrDefault(x => x.Id == Id));

【讨论】:

【参考方案2】:

您应该使用它.SingleOrDefault.FirstOrDefault() 如下所示:-

...

return _genres.SingleOrDefault(x => x.Id == Id);

或者

...

return _genres.FirstOrDefault(x => x.Id == Id);

它将解决您的问题。

【讨论】:

正如你提到的,这不是异步的,所以await 是多余的。 @HenryTwist 我的错误,我更新了我的答案。

以上是关于List<Model> 不包含定义 SingleOrDefaultAsync 和可访问的扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 从视图提交包含输入和 List<Model> 的表单到操作

CS1061 "List<RectTransform>"未包含"Last"的定义,并且找不到可接受第一个"List<RectTran

如何将 List<Model> 从 Activity 传递到 Fragment

如何判断List<String>list中是不是包含某个字符串

Linq lambda 实体,不包含定义

Pipline Model--实体关系抽取<总结>