使用WhereIf时未找到.ToListAsync()

时间:2018-05-05 17:59:43

标签: c# linq entity-framework-core aspnetboilerplate

我正在阅读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指令或程序集引用?)

2 个答案:

答案 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中使用。