一般的な実装で問題を解決するにはいくつか問題があります。DbSet.Includeを自分のジェネリックインターフェイス/クラスにラップする方法
まず第一に、私は
を達成しようとしている私は、このために、私自身のリポジトリ(以降、私のUOW)を実装しようとしている私がしました:
だから問題は何ですか?私IRepositoryで
私はこのている:
public interface IRepository<T> where T : class
{
List<T> GetAll();
/* some other methods*/
//Here is my problem
DbQuery<T> Include<T, U>(Expression<Func<T, U>> path);
}
をし、私のクラスで私はこの持っている:
public class Repository<T> : IRepository<T> where T : class
{
protected readonly MyDBContext context = null;
protected DbSet<T> DbSet { get; set; }
#region Constructors
public Repository()
{
context = new MyDBContext();
DbSet = context.Set<T>();
}
public Repository(MyDBContext context)
{
this.context = context;
}
#endregion
public List<T> GetAll()
{
return DbSet.ToList();
}
/* more code for the rest of methods*/
//And here is my problem
DbQuery<T> Include<T, U>(Expression<Func<T, U>> path) where U : class
{
return (DbSet<T>)DbSet.Include(path);
}
}
だから、私はインターフェイスにさまざまな方法でこのメソッドを定義するためにしようと試みてきました私が使っているのは、少なくともメソッドを正しく定義しているようです。しかし、実装では、私はエラーを持っている:
私はメソッド定義に
DbQuery<T> Include(Expression<Func<T, U>> path)
をT、Uを削除しようと試みてきた
「最高過負荷偶然がいくつかの無効な引数を持っています」
しかし、私はUを指定することはできませんし、私はエラーがあります:
"Uの型または名前空間が見つかりませんディレクティブがありますか?私はこれを行う場合は、「
:
DbQuery<T> Include(Expression<Func<T, T>> path)
を私はすべてのエラーを持っていますが、Tが同じであるように、私もエラーが発生していた別のクラス
とラムダを使用するためにポイントを見逃しません
public class MyClassRepository : Repository<MyClass>, IMyClassRepository
012:内部および外部定義
にアイデアは後にこのリポジトリは次のようにMyRepositoryを定義するために使用する必要がありますされます次いで
MyClassRepository repo = new MyClassRepository();
と:次いで
とのような制御装置に使用されるインターフェイスに異なる方法を規定する、今は解決しました。このため
repo.Include(o => o.MyOtherClass);
IQueryable<T> Include(string path)
として実装され、
ひどいではありませんrepo.Include("MyOtherClass");
を私はラムダ機能を失い:
が、その後、私のコントローラで私はこのように使用することをしました。
誰かが私が見逃していることを察知すれば、とても感謝しています。
は、クラスレベルでそれをすでに定義したので、インクルードする方法から、一般的なT宣言を削除し、あなたにすべての
ガブリエル
Adrian、ありがとう、時にはあなたの前に大きな灰色のゾウがあり、あなたはそれを見ることができません! 私はすでに実装しており、魅力的なように機能しています。 – Gabriel
素晴らしい。レポクラスにDbContextを作成するのではなく、後でUoWを適切に実装できるようにコンストラクタを介して渡すべきです。 –
@AdrianIftode文字列パスではなく、 '' i => i.NavigationProperty ''としてインクルードを実装したい場合はどうなりますか? –