3

EF6(alpha3)非同期拡張メソッドを利用するように既存のプロジェクトを変更しています。linqtoentitiesクエリに渡されるfuncパラメータを受け取るメソッドが1つあります。動作するコード、pre-asyncの例を次に示します。

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)と正しく機能します。

私はこれを正しく行っているのか、それとも非同期で作業するときに述語を渡すためのより良いオプションがあるのか​​興味があります。

4

3 に答える 3

7

ではなく、拡張メソッドを.Where( predicate )使用しています。IEnumerable.WhereIQueryable.Where

これは、述語がデータベースサーバーではなく、アプリで実行されていることを意味します。

を使用する場合はIQueryable.Where、述語をExpression<Func<type, bool>>デリゲートとしてではなく、式ツリーとして渡す必要があります。

したがって、メソッドのシグネチャを次のように変更するだけです。

public async Task<IEnumerable<Type>>
  GetTypeSet(Expression<Func<Type, bool>> predicate)
{
  ...
于 2013-03-25T23:15:53.660 に答える
5

ToListAsyncは上の拡張メソッドでIQueryable<T>あり、ではないと思いIEnumerable<T>ます。predicateパラメータのタイプをに変更する必要がありますExpression<Func<Type, bool>>

のようなすべての拡張メソッドをIQueryable<T>実装しているので、利用可能ですが、通常は使用しようとしているものではありません。IEnumerable<T>IEnumerable<T>Where(this IEnumerable<T>, Func<T, bool>)

predicateFunc<Type, bool>タイプなので

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

あなたがIEnumerable<Type>それをしたいときですIQueryable<Type>。のタイプをに変更するpredicateExpression<Func<Type, bool>>Queryable.Whereextensionメソッドが使用され、必要に応じてが返さIQueryable<Item>れます。

于 2013-03-25T23:15:46.177 に答える
3

関数に式を使用させる必要があります。そうしないと、Where拡張機能がIQueryableではなくIEnumerableにフォールバックします。そして、ToListAsyncはIQueryableの唯一の拡張メソッドです。

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

乾杯

于 2013-03-25T23:17:30.143 に答える