using System.Collections.Generic; using System.Linq; namespace NzbDrone.Core.Datastore { public interface IBasicRepository where TModel : ModelBase, new() { IEnumerable All(); int Count(); TModel Get(int id); TModel Insert(TModel model); TModel Update(TModel model); TModel Upsert(TModel model); void Delete(int id); IList InsertMany(IList model); IList UpdateMany(IList model); void DeleteMany(IList model); void Purge(); bool HasItems(); } public class BasicRepository : IBasicRepository where TModel : ModelBase, new() { public BasicRepository(IObjectDatabase objectDatabase) { ObjectDatabase = objectDatabase; } public IObjectDatabase ObjectDatabase { get; private set; } protected IEnumerable Queryable { get { return ObjectDatabase.AsQueryable(); } } public IEnumerable All() { return Queryable.ToList(); } public int Count() { return Queryable.Count(); } public TModel Get(int id) { return Queryable.Single(c => c.Id == id); } public TModel Insert(TModel model) { return ObjectDatabase.Insert(model); } public TModel Update(TModel model) { return ObjectDatabase.Update(model); } public IList InsertMany(IList model) { return ObjectDatabase.InsertMany(model); } public IList UpdateMany(IList model) { return ObjectDatabase.UpdateMany(model); } public void DeleteMany(IList model) { ObjectDatabase.DeleteMany(model); } public TModel Upsert(TModel model) { if (model.Id == 0) { return ObjectDatabase.Insert(model); } return ObjectDatabase.Update(model); } public void Delete(int id) { var itemToDelete = Get(id); ObjectDatabase.Delete(itemToDelete); } public void DeleteMany(IEnumerable ids) { foreach (var id in ids) { Delete(id); } } public void Purge() { DeleteMany(Queryable.Select(c => c.Id)); } public bool HasItems() { return Queryable.Any(); } } }