6

次のように使用するために、リポジトリに複数のインクルード メソッドを作成しようとしています。

repository.Include<Post>(x => x.Images, x => x.Tags).First(x => x.Id == 1)

私は次のように試しました:

public IQueryable<T> Include<T>(params Expression<Func<T, Object>>[] paths) where T : class {
  return paths.Aggregate(_context.Set<T>(), (x, path) => x.Include(path));
} // Include

しかし、私はエラーが発生します:

タイプ 'System.Linq.IQueryable' を 'System.Data.Entity.DbSet' に暗黙的に変換することはできません。

元のインクルードは次のとおりです。

public static IQueryable Include( this IQueryable source, Expression> path ) where T : class;

リポジトリ メソッドを静的に変更せずにこれを機能させることはできますか?

ありがとうございました、

ミゲル

4

3 に答える 3

9

.Include1回の呼び出しで複数のパスを許可する独自の非拡張メソッドを本当に作成したい場合は、すでに提供されている.Includeメソッドに内部的に変換して、次のようなことができます

public IQueryable<T> Include<T>(params Expression<Func<T, object>>[] paths)
    where T : class
{
    IQueryable<T> query = _context.Set<T>();
    foreach (var path in paths)
        query = query.Include(path);
    return query;
}

これはあなたがすでに持っているものにかなり近いですが、あなたが遭遇した落とし穴を回避します.私のバージョンでEnumerable.Aggregate置き換えるIQueryable<T> queryと同じ問題が発生します.var query

.Include多くを使用すると、パフォーマンスが低下する可能性があることに注意してください。状況に応じて、複数のクエリを使用するように書き直して、トランザクションで次々に実行できます。

.Include個人的には、任意の で既に提供されている拡張メソッド ( using System.Data.Entity;) を呼び出すことができるのでIQueryable、次のように記述します。

repository.Posts.Include(x => x.Images).Include(x => x.Tags).First(x => x.Id == 1)
于 2012-12-11T12:05:38.383 に答える