我已经分配了一个新项目,我决定给EF一个go.In这个项目我所做的就是获取没有持久性的数据。我必须实现一些缓存,就是这样。
阅读存储库模式我发现了大量的代码示例等......它们似乎对我来说都是错误的。它们实现了一对一的Entity to Repository。
在我的项目中,我只需要阅读数据而不是保存等...只是阅读。我有100个实体我无法创建100s存储库似乎都错了。
我决定从简单开始,我都需要这个:
public interface IRepository : IDisposable
{
IEnumerable<T> GetAll<T>() where T : class;
IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class;
T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class;
}
public class Repository : IRepository
{
public IEnumerable<T> GetAll<T>() where T : class
{
return ???.ToArray();
}
public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
{
return ???.Where(predicate).ToArray();
}
public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
{
return ???.Where(predicate).FirstOrDefault();
}
public void Dispose()
{
throw new NotImplementedException();
}
}
我正在努力的是我把“???”放在哪里应该是我的IdbSet。
我如何实施我的具体存储库?任何建议或点头测试样本都可以。
非常感谢答案 0 :(得分:1)
首先,您最好更改GetAll()
和Find()
方法以返回IQueryable<T>
而不是IEnumerable<T>
,以便使用Linq-to实现对数据集的进一步查询-Entities。
从EF实施开始,尝试这样的事情:
public class EFRepository : DbContext, IRepository
{
// ctor:
// pass a full connecting-string, or "name=someName" from configuration
public EFRepository(string connectionStringOrName) : base(connectionStringOrName)
{
// init sets
this.Entities1 = this.Set<EntityOfSomeType>();
this.Entities2 = this.Set<EntityOfOtherType>();
}
public IEnumerable<T> GetAll<T>() where T : class
{
return this.Set<T>().ToArray();
}
public IEnumerable<T> Find<T>(Expression<Func<T, bool>> predicate) where T : class
{
return this.Set<T>().Where(predicate).ToArray();
}
public T GetOne<T>(Expression<Func<T, bool>> predicate) where T : class
{
return this.Set<T>.FirstOrDefault(predicate);
}
public void Dispose()
{
base.Dispose();
}
// Your DbSets...
public IDbSet<EntityOfSomeType> Entities1 { get; set; }
public IDbSet<EntityOfAnotherType> Entities2 { get; set; }
}
(我假设你要代码优先使用DbContext