これを行うにはさまざまな方法がありますが、簡単に説明するIEnumerable<T>
と、GetAll() メソッドに対して を返します。ただし、おそらく何らかの方法でページングを実装したいと思うでしょう。ほとんどのシナリオで基本的なデータ アクセスを行い、Enumerable を返す汎用リポジトリをセットアップすることをお勧めします。より複雑なクエリ用に予約する必要がある単一のメソッドを予約して、IQueryable<T>
. 基本的な簡素化された実装は、次のようになります。
public class Repository<T> : IRepository<T> where T : class
{
internal ObjectContext _objectContext;
internal ObjectSet<T> _objectSet;
public Repository(ObjectContext objectContext)
{
_objectContext = objectContext;
_objectSet = objectContext.CreateObjectSet<T>();
}
public IQueryable<T> GetQuery()
{
return _objectSet;
}
public IEnumerable<T> GetAll()
{
return GetQuery().ToList();
}
public IEnumerable<T> Find(Func<T, bool> where)
{
return _objectSet.Where<T>(where);
}
public T Single(Func<T, bool> where)
{
return _objectSet.SingleOrDefault<T>(where);
}
public List<T> Page<TKey>(Expression<Func<T, bool>> where, int page, int pagesize, Expression<Func<T, TKey>> orderBySelector, bool ascending)
{
return ascending
? GetQuery().Where(where).OrderBy(orderBySelector).Skip((page - 1) * pagesize).Take(pagesize).ToList()
: GetQuery().Where(where).OrderByDescending(orderBySelector).Skip((page - 1) * pagesize).Take(pagesize).ToList();
}
public void Delete(T entity)
{
_objectSet.DeleteObject(entity);
}
public void Add(T entity)
{
_objectSet.AddObject(entity);
}
}
インターフェイスは次のようになります
public interface IRepository<T> where T : class
{
IQueryable<T> GetQuery();
IEnumerable<T> GetAll();
IEnumerable<T> Find(Func<T, bool> where);
T Single(Func<T, bool> where);
List<T> Page<TKey>(Expression<Func<T, bool>> where, int page, int pagesize, Expression<Func<T, TKey>> orderBySelector, bool ascending);
void Delete(T entity);
void Add(T entity);
}
上記は、単純な汎用リポジトリの始まりとして機能できます。エンティティを取得したら、AutoMapper は必要ありません。多くの ViewModel がエンティティと同じプロパティを持つため、作業が楽になります。新しい ViewModel または ViewModel のリストを定義し、独自にプロパティをマップするだけです。
List<ViewModel> vm = new List<ViewModel>();
foreach (var e in entities)
{
ViewModel v = new ViewModel();
v.something = e.something;
// perform the rest
vm.Add(v);
}
※入力がかなり長かったので、誤字脱字はご容赦ください(笑)