通用存储库和多种PK类型

时间:2013-01-16 20:59:33

标签: c# .net linq-to-sql repository-pattern

我正在尝试使用Linq To SQL实现通用存储库。我的问题在于我的一些基础表具有int ID和一些Guid ID。我该如何解释?

public T GetById(int id)
{
    return this._context.GetTable<T>().Single(x => x.ID.Equals(id));
}

2 个答案:

答案 0 :(得分:4)

将另一个通用参数添加到存储库界面。

public interface IRepo<TType, PKType>
{
    TType GetById(PKType id);
}

然后实施它。

public class CustomerRepo : IRepo<Customer, Guid>
{
    public Customer GetById(Guid id)
    {
        // code to get from repo
    }
}

答案 1 :(得分:-3)

嗯,首先 - 一个GetById开始没有意义,听说过LINQ?让用户决定。得到任何东西。

其次,即使您坚持这一点,仍然存在仿制药。

GetById(T id)

会走得那么远,你可以在泛型上有多个Type,但你假设“id”为name,这需要一个接口。

事实上,你有更严重的问题,如

  

GetTable()。Single(x =&gt; x.ID.Equals(id));

在这种情况下,

可能在编译器中流行,没有限制要求T具有id字段。因此,您不能在通用方法中使用它。

这就是说 - 正如我在开始时所说的那样,通过剥夺用户对语言(linq)的重要部分的强大功能,你基本上是在创建另一个通用错误存储库的反模式实现。