使用WhereIf时未找到.ToListAsync()

Mah*_*gdu 4 c# linq entity-framework-core aspnetboilerplate

我正在阅读本教程.我想使用asyncEF Core查询.

当我使用这样的时候它很好用:

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();
Run Code Online (Sandbox Code Playgroud)

但我想使用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();
Run Code Online (Sandbox Code Playgroud)

错误:

'IOrderedEnumerable'不包含'ToListAsync'的定义,并且没有可以找到接受类型'IOrderedEnumerable'的第一个参数的扩展方法'ToListAsync'(您是否缺少using指令或程序集引用?)

Xee*_*vis 7

您使用错误的WhereIf扩展名,很容易错过,因为您需要使用Visual Studio提供的额外功能.

您正在使用返回IEnumerable的扩展名

Abp.Collections.Extensions.EnumerableExtensions.WhereIf<T>()
Run Code Online (Sandbox Code Playgroud)

您需要使用返回IQueryable的扩展名

Abp.Linq.Extensions.QueryableExtensions.WhereIf<T>()
Run Code Online (Sandbox Code Playgroud)

这是一个简单的修复,只需使用Abp.Linq.Extensions添加到文件的顶部;