Advertisement
Guest User

Untitled

a guest
Jun 3rd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.61 KB | None | 0 0
  1.  
  2. public interface IStorable<TKey> {
  3.     public TKey id { get; }
  4. }
  5.  
  6. public class BaseFilter {
  7.     public int? Skip;
  8.     public int? Take;
  9. }
  10.  
  11. public interface IRepository<TEntity, TKey, TFilter>
  12.             where TEntity: IStorable<TKey>
  13.             where TKey: struct
  14.             where TFilter: BaseFilter
  15. {
  16.     IQueriable<TEntity> GetById(TKey id);
  17.     IQueriable<TEntity> GetMany(TFilter filter);
  18.     void Save(TEntity obj);
  19.     void Delete(TKey id);
  20.     void Commit();
  21. }
  22.  
  23. public abstract class BaseRepository<TEntity, TKey, TFilter, TDbContext>:
  24.                             IRepository<TEntity, TKey, TFilter>
  25.             where TDbContext: DbContext
  26.             where TEntity: IStorable<TKey>
  27.             where TKey: struct
  28.             where TFilter: BaseFilter
  29. {
  30.     protected TDbContext _context;
  31.  
  32.     public BaseRepository(TDbContext context) {
  33.         _context = context;
  34.     }
  35.  
  36.     IQueriable<TEntity> GetById(TKey id) {
  37.         return _context.Set<TEntity>().Where(x => x.Id == id);
  38.     }
  39.  
  40.     IQueriable<TEntity> GetMany(TFilter filter) {
  41.         var query = _context.Set<TEntity>();
  42.  
  43.         query = ApplyFilter(query, filter);
  44.  
  45.         return query.Skip(filter?.Skip ?? 0)
  46.                     .Take(filter?.Take ?? 20);
  47.     }
  48.  
  49.     void Save(TEntity obj) {
  50.         if (obj.Id == default) {
  51.             _context.Set<TEntity>().Add(obj);
  52.         } else {
  53.             _context.Save(obj);
  54.         }
  55.     }
  56.  
  57.     void Delete(TKey id) {
  58.         var found = GetById(id).FirstOrDefault();
  59.         if (found == null) ...
  60.         _context.Remove(obj);
  61.     }
  62.  
  63.     void Commit() => _context.SaveChanges();
  64.  
  65.  
  66.     public virtual IQueriable<TEntity> ApplyFilter(IQueriable<TEntity> query, TFilter filter) => query;
  67. }
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76. public class Post: IStorable<int>
  77. {
  78.     public int Id { get; set; }
  79.     public bool IsDraft { get; set; }
  80.  
  81.     public string Title { get; set; }
  82.     public string Content { get; set; }
  83. }
  84.  
  85. public class PostFilter: BaseFilter {
  86.     public bool PublishedOnly { get; set; }
  87. }
  88.  
  89. public interface IPostRepository: IRepository<Post, int, PostFilter>
  90. {
  91. }
  92.  
  93. public class PostRepository: BaseRepository<Post, int, PostFilter, MyDbContext>
  94. {
  95.     public PostRepository(MyDbContext context): base(context) {}
  96.  
  97.     public override IQueriable<TEntity> ApplyFilter(IQueriable<Post> query,
  98.                                                     PostFilter filter)
  99.     {
  100.         var baseQuery = base.ApplyFilter(query);
  101.  
  102.         if (filter != null && filter.PublishedOnly) {
  103.             return baseQuery.Where(x => !x.IsDraft);
  104.         }
  105.  
  106.         return baseQuery;
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement