【问题标题】:Error passing in func<type, bool> as a parameter to an async method将 func<type, bool> 作为参数传递给异步方法时出错
【发布时间】:2013-03-26 07:27:11
【问题描述】:

我正在修改现有项目以利用 EF6 (alpha3) 异步扩展方法。我有一种方法采用 func 参数,该参数被传递到 linq to entity 查询中。这是工作代码的示例,预异步:

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

应用异步后:

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

此时,我收到一条错误消息,指出 IEnumerable 没有 ToListAsync 的定义。如果我删除 .Where(predicate) 它会正常运行。

我很好奇我是否正确地处理了这个问题,或者在异步工作时是否有更好的选择来传递谓词。

【问题讨论】:

    标签: c# task-parallel-library entity-framework-6


    【解决方案1】:

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

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

    如果你想使用IQueryable.Where,你必须将你的谓词作为Expression&lt;Func&lt;type, bool&gt;&gt;——一个表达式树——而不是一个委托来传递。

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

    public async Task<IEnumerable<Type>>
      GetTypeSet(Expression<Func<Type, bool>> predicate)
    {
      ...
    

    【讨论】:

    • 这就是我所缺少的。感谢您的帮助!
    【解决方案2】:

    我假设ToListAsyncIQueryable&lt;T&gt; 而不是IEnumerable&lt;T&gt; 的扩展方法。您应该将predicate 参数的类型更改为Expression&lt;Func&lt;Type, bool&gt;&gt;

    由于IQueryable&lt;T&gt; 实现了IEnumerable&lt;T&gt;,所有IEnumerable&lt;T&gt; 扩展方法(如Where(this IEnumerable&lt;T&gt;, Func&lt;T, bool&gt;))都可用,但通常不是您打算使用的。

    由于predicateFunc&lt;Type, bool&gt; 的类型

    dbSet.Where(d => d.isPublic == true)
    

    当您希望它是 IQueryable&lt;Type&gt; 时,它是 IEnumerable&lt;Type&gt;。 将predicate 的类型更改为Expression&lt;Func&lt;Type, bool&gt;&gt; 将导致使用Queryable.Where 扩展方法,该方法根据需要返回IQueryable&lt;Item&gt;

    【讨论】:

    • +1 感谢您提供详细信息。非常有帮助。希望我可以选择多个答案。
    【解决方案3】:

    您必须使函数采用表达式,否则 Where 扩展将回退到 IEnumerable,而不是 IQueryable。而 ToListAsync 只是 IQueryable 上的扩展方法。

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

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多