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<Genre>
(例如,如果您需要实现一个用于异步使用的接口),那么您可以使用 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