2

我正在尝试制作通用Repository pattern基类,从中将实现成员。这是一个代码:

public abstract class RepositoryBase<TEntity, TType> : IRepository<TEntity, TType>
    where TEntity : EntityBase<TType>
{
    public IAdNetMsSqlContext Context { get; set; }
    public DbSet<TEntity> DbSet { get; set; }

    public RepositoryBase(IAdNetMsSqlContext context)
    {
        Context = context;
        DbSet = context.Set<TEntity>();
    }

    public IQueryable<TEntity> Get(TType id)
    {
        //!!! Here is an error
        return DbSet.FirstOrDefault(e => e.Id == id);
    }
    ....
}

我得到了错误:

   Error    1   Operator '==' cannot be applied to operands of type 'TType' and    `'TType' .... AdNet.Common.Base

在行中:

   return DbSet.FirstOrDefault(e => e.Id == id);

我不知道该怎么想。TType 肯定等于 TType。

感谢任何提前!

4

3 回答 3

7

这里有两个问题:

  • 你试图返回一个IQueryable<TEntity>whenFirstOrDefault只会返回一个TEntity,所以你应该改变返回类型
  • 您正在尝试使用==which 在不受约束的泛型上是不允许的。您可以约束TType成为一个类,此时它将执行引用相等,但这可能不是您想要给出的示例。

鉴于无论如何这都会被翻译成 SQL(所以你不必担心装箱的影响),我只需将其转换为 use Equals

public TEntity Get(TType id)
{
    return DbSet.FirstOrDefault(e => e.Id.Equals(id));
}

或者你不能一开始就使用DbSet<TEntity>.Find吗?

public TEntity Get(TType id)
{
    return DbSet.Find(id);
}
于 2013-03-28T11:59:02.443 回答
1

您可能知道这TType显然等于TType,但编译器不知道任何任意的、不受约束的TType是否会有一个==运算符(又名op_Equality)。

可以Equals改用吗?

return DbSet.FirstOrDefault(e => e.Id.Equals(id));
于 2013-03-28T12:01:09.160 回答
0

碰巧两个泛型共享相同的名称:TType

从编译器的角度来看,它没有意识到 e.Id 与 id 相同,并且您很可能可以编写一些代码来使场景真实。

我假设 TType 的比较检查它在物理上是相同的对象,而不是具有相同值的 2 个对象。如果您将两者都转换为 Object ,则比较应该有效

于 2013-03-28T12:01:06.230 回答