将func <type,bool>作为参数传递给异步方法时出错

Ben*_*lda 3 c# task-parallel-library entity-framework-6

我正在修改现有项目以利用EF6(alpha3)异步扩展方法.我有一个方法,它接受一个func参数,它被传递到linq到实体查询.以下是工作代码的示例,pre-async:

public IEnumerable<type> GetTypeSet(Func<Type, bool> predicate)
    {
        return dbSet.Where(d => d.isPublic == true).Where(predicate).tolist();
    }
Run Code Online (Sandbox Code Playgroud)

应用异步后:

public async Task<IEnumerable<Type>> GetTypeSet(Func<Type, bool> predicate)
    {
        return await(dbSet.Where(d => d.isPublic == true)
        .Where(predicate)).ToListAsync();
    }
Run Code Online (Sandbox Code Playgroud)

此时,我收到一条错误,指出IEnumerable没有ToListAsync的定义.如果我删除.Where(predicate)它功能正常.

我很好奇我是否正确地解决了这个问题,或者在使用异步时传递谓词的更好选择.

Lee*_*Lee 5

我假设ToListAsync是一种扩展方法,IQueryable<T>而不是IEnumerable<T>.您应该将predicate参数的类型更改为Expression<Func<Type, bool>>.

由于IQueryable<T>实现了IEnumerable<T>所有IEnumerable<T>扩展方法,如Where(this IEnumerable<T>, Func<T, bool>)可用,但通常不是您打算使用的.

既然predicate是一种Func<Type, bool>类型

dbSet.Where(d => d.isPublic == true)
Run Code Online (Sandbox Code Playgroud)

IEnumerable<Type>你想要它的时候IQueryable<Type>.更改predicateto 的类型Expression<Func<Type, bool>>将导致使用Queryable.Where扩展方法,该方法将IQueryable<Item>根据需要返回.


Nic*_*ler 5

.Where( predicate )使用的是IEnumerable.Where扩展方法,而不是IQueryable.Where.

这意味着,谓词正在您的应用程序中运行,而不是在数据库服务器上运行.

如果要使用IQueryable.Where,则必须将谓词作为Expression<Func<type, bool>>表达式树传递- 而不是作为委托.

所以,只需将方法签名更改为:

public async Task<IEnumerable<Type>>
  GetTypeSet(Expression<Func<Type, bool>> predicate)
{
  ...
Run Code Online (Sandbox Code Playgroud)