EntityFramework 存储库模板 - 如何在模板类中编写 GetByID lambda?

发布于 2024-09-03 17:47:01 字数 597 浏览 3 评论 0原文

我正在尝试为我当前正在处理的基于实体框架的项目编写一个通用的通用存储库模式模板类。 (大大简化的)接口是:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

胡渣熟男 2024-09-10 17:47:01

我定义了一个接口:

public interface IIdEntity
{
    long Id { get; set; }
}

并修改了生成 POCO 类的 t4 模板,以便每个类都必须实现公共接口 IIdEntity 接口。

像这样:

using System.Diagnostics.CodeAnalysis;
public partial class User : IIdEntity
{
    public virtual long Id
    {
        get;
        set;
    }

通过这个修改,我可以编写一个通用的 GetById(long id),如下所示:

public T GetById(long id)
{
    return Single(e => e.Id == id);
}

IRepository 定义如下:

/// <summary>
/// Abstract Base class which implements IDataRepository interface.
/// </summary>
/// <typeparam name="T">A POCO entity</typeparam>
public abstract class DataRepository<T> : IDataRepository<T>
    where T : class, IIdEntity
{

I've defined a interface:

public interface IIdEntity
{
    long Id { get; set; }
}

And modified the t4 template which generates my POCO classes so that every class must implement the public interface IIdEntity interface.

Like this:

using System.Diagnostics.CodeAnalysis;
public partial class User : IIdEntity
{
    public virtual long Id
    {
        get;
        set;
    }

With this modification I can write a generic GetById(long id) like:

public T GetById(long id)
{
    return Single(e => e.Id == id);
}

The IRepository is defined as follows:

/// <summary>
/// Abstract Base class which implements IDataRepository interface.
/// </summary>
/// <typeparam name="T">A POCO entity</typeparam>
public abstract class DataRepository<T> : IDataRepository<T>
    where T : class, IIdEntity
{
血之狂魔 2024-09-10 17:47:01

您可以创建一个包含 Id 属性的小接口,并将 T 限制为实现它的类型。

编辑:
根据评论,如果您接受编译器不会帮助您确保 Id 属性实际存在的事实,您可能可以执行以下操作:

public class Repo<T> where T : class
{
    private IEnumerable<T> All()
    {
        throw new NotImplementedException();
    }

    private bool FilterOnId(dynamic input, int id)
    {
        return input.Id == id;
    }

    public T GetById(int id)
    {
        return this.All().Single(t => FilterOnId(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:

public class Repo<T> where T : class
{
    private IEnumerable<T> All()
    {
        throw new NotImplementedException();
    }

    private bool FilterOnId(dynamic input, int id)
    {
        return input.Id == id;
    }

    public T GetById(int id)
    {
        return this.All().Single(t => FilterOnId(t, id));
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文