我正在阅读this tutorial。我想在EF Core中使用async
查询。
当我像这样使用时效果很好:
var tasks = await _taskRepository
.GetAll()
//.WhereIf(!string.IsNullOrEmpty(input?.Title), x => x.Title.Contains(input.Title))
//.WhereIf(input?.State != null, x => x.State == input.State.Value)
//.OrderByDescending(x => x.CreationTime)
.ToListAsync();
但我想使用whereif和orderby之类的
var tasks = await _taskRepository
.GetAll()
.WhereIf(!string.IsNullOrEmpty(input?.Title), x => x.Title.Contains(input.Title))
.WhereIf(input?.State != null, x => x.State == input.State.Value)
.OrderByDescending(x => x.CreationTime)
.ToListAsync();
错误:
'IOrderedEnumerable'不包含'ToListAsync'的定义,并且没有可以找到接受类型'IOrderedEnumerable'的第一个参数的扩展方法'ToListAsync'(您是否缺少using指令或程序集引用?)
答案 0 :(得分:7)
你使用错误的WhereIf扩展程序,很容易错过,因为你需要使用Visual Studio无法提供额外的功能。
您正在使用返回IEnumerable
的扩展程序Abp.Collections.Extensions.EnumerableExtensions.WhereIf<T>()
您需要使用返回IQueryable
的扩展名Abp.Linq.Extensions.QueryableExtensions.WhereIf<T>()
这是一个简单的解决方法,只需使用Abp.Linq.Extensions在文件的顶部添加;
答案 1 :(得分:2)
IOrderedEnumerable<Task>
表示您正在使用IEnumerable<Task>
。
实体框架核心与IQueryable<T>
(代表数据库查询)一起使用,而不是IEnumerable<T>
(代表内存中的集合)。只要IQueryable<T>
转换为IEnumerable<T>
,就会在数据库服务器上执行查询并检索结果。
所以:如果你正在调用一个返回IEnumerable<T>
的方法,那么该方法不能在LINQ to Entities中使用。