DBContextを使用してEFとインターフェイスする汎用リポジトリを作成しています。
主キー値を受け取り、エンティティを返す汎用のGet()メソッドがあります。
public class DALRepository<DALEntity> : IDisposable, IGenericRepository<DALEntity> where DALEntity : class
{
private IDbSet<DALEntity> dbSet;
private NWEntities context;
public DALRepository()
{
context = new NWEntities();
context.Configuration.LazyLoadingEnabled = false;
dbSet = context.Set<DALEntity>();
}
これが簡単なgetメソッドです-PKで動作します-まさに私が欲しいものです。
public DALEntity Get(string ID)
{
return dbSet.Find(ID);
}
これを変更して、消費者がインクルードのリストを渡すことができるようにします。これにより、顧客だけを返品するだけでなく、注文の返品もリクエストできます。ここで私は問題にぶつかっています。私がこれを行う場合:
public DALEntity Get(string ID, IEnumerable<string> IncludeEntities = null)
{
IQueryable<DALEntity> query = dbSet;
query = IncludeEntities.Aggregate(query, (current, includePath) => current.Include(includePath));
}
IQueryableでfindを使用できません。また、includesを渡すことができないため、Find()を直接見つけることはできません。IQueryableで代わりにwhereラムダを使用する場合、エンティティのPKを使用するように指示するにはどうすればよいですか?ジェネリック型は「ID」などの明確に定義されたプライマリ列名を持つIPkeyインターフェイスを実装する必要があると主張するジェネリック制約があると思いますが、DBContextによって生成されたエンティティは実装する必要があるため使用できませんこのインターフェース。必要に応じてT4を変更してこれを行うことができます-そして、XMLコメントを発行するようにすでに変更しているので、それを嫌うことはありません-しかし、誰かがもっと簡単な方法を持っていますか?私が必要としているのは、インクルードのリストを受け入れるオーバーロードされたfind()だと思います。
だから私の質問は、インクルードで検索を使用する方法、またはPKを知っているラムダを書く方法のいずれかです。このようなラムダをパラメーターとして受け取ることはできません。これは、最終的にWCFサービスによって消費されるためです。