使用泛型的突破性错误

Mar*_*ris 2 .net c# generics

我正在尝试制作通用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);
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

   Error    1   Operator '==' cannot be applied to operands of type 'TType' and    `'TType' .... AdNet.Common.Base
Run Code Online (Sandbox Code Playgroud)

在线:

   return DbSet.FirstOrDefault(e => e.Id == id);
Run Code Online (Sandbox Code Playgroud)

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

Thx任何提前!

Jon*_*eet 7

这里有两个问题:

  • 您尝试返回的IQueryable<TEntity>时间FirstOrDefault只返回一个TEntity,因此您应该更改返回类型
  • 你试图使用==不受约束的泛型不允许的东西.你可以约束TType成为一个类,此时它将执行引用相等,但考虑到你给出的例子,这可能不是你想要的.

鉴于这将被转换为SQL无论如何(所以你不需要担心拳击的影响)我只是将其转换为使用Equals:

public TEntity Get(TType id)
{
    return DbSet.FirstOrDefault(e => e.Id.Equals(id));
}
Run Code Online (Sandbox Code Playgroud)

或者你不能只是DbSet<TEntity>.Find在第一时间使用?

public TEntity Get(TType id)
{
    return DbSet.Find(id);
}
Run Code Online (Sandbox Code Playgroud)