EntityFramework 存储库模板 - 如何在模板类中编写 GetByID lambda?
我正在尝试为我当前正在处理的基于实体框架的项目编写一个通用的通用存储库模式模板类。 (大大简化的)接口是:
internal interface IRepository<T> where T : class
{
T GetByID(int id);
IEnumerable<T> GetAll();
IEnumerable<T> Query(Func<T, bool> filter);
}
GetByID 被证明是杀手锏。在实现中:
public class Repository<T> : IRepository<T>,IUnitOfWork<T> where T : class
{
// etc...
public T GetByID(int id)
{
return this.ObjectSet.Single<T>(t=>t.ID == id);
}
t=>t.ID == id 是我正在努力解决的特定问题。是否有可能在没有特定于类的信息可用的模板类中编写类似的 lambda 函数?
I am trying to write a generic one-size-fits-most repository pattern template class for an Entity Framework-based project I'm currently working on. The (heavily simplified) interface is:
internal interface IRepository<T> where T : class
{
T GetByID(int id);
IEnumerable<T> GetAll();
IEnumerable<T> Query(Func<T, bool> filter);
}
GetByID is proving to be the killer. In the implementation:
public class Repository<T> : IRepository<T>,IUnitOfWork<T> where T : class
{
// etc...
public T GetByID(int id)
{
return this.ObjectSet.Single<T>(t=>t.ID == id);
}
t=>t.ID == id is the particular bit I'm struggling with. Is it even possible to write lambda functions like that within template classes where no class-specific information is going to be available?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我定义了一个接口:
并修改了生成 POCO 类的 t4 模板,以便每个类都必须实现公共接口 IIdEntity 接口。
像这样:
通过这个修改,我可以编写一个通用的 GetById(long id),如下所示:
IRepository 定义如下:
I've defined a interface:
And modified the t4 template which generates my POCO classes so that every class must implement the public interface IIdEntity interface.
Like this:
With this modification I can write a generic GetById(long id) like:
The IRepository is defined as follows:
您可以创建一个包含 Id 属性的小接口,并将 T 限制为实现它的类型。
编辑:
根据评论,如果您接受编译器不会帮助您确保 Id 属性实际存在的事实,您可能可以执行以下操作:
You could just create a small interface containing the Id-property and have T be constrained to types that implement it.
EDIT:
Based on the comment, if you accept the fact that the compiler wont be helping you ensure that the Id property actually exists you might be able to do something like this: