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)它功能正常.
我很好奇我是否正确地解决了这个问题,或者在使用异步时传递谓词的更好选择.
我假设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>根据需要返回.
您.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)