我正在尝试制作通用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任何提前!
这里有两个问题:
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)