Issue with IEnumerable<TEntity>
本文关键字:TEntity gt with lt Issue IEnumerable | 更新日期: 2023-09-27 18:20:55
我想写一个通用方法,返回任何模型,如产品、销售额等。类似这样的东西(.net 3.5;我不是使用实体框架)
public class ProductRepository<TEntity> : IProduct<TEntity>
where TEntity : class
{
public IEnumerable<TEntity> GetProductList(string Type)
{
IEnumerable<Product> fLit = from p in ProductList
select p;
return fLit;
}
}
但我得到以下错误
无法将类型
System.Collections.Generic.IEnumerable<Product>
'隐式转换为CCD_ 2。存在显式转换(是否缺少强制转换?)
感谢您的帮助。提前谢谢。
恐怕您必须更改域的设计,存储库模式不是这样实现的。首先,你必须为你的域模型有一个基类,如下所示(当然这不是必要的):
public class EntityBase {
public virtual int Id { get; set; }
}
那么你必须有一个通用的IRepository接口:
public interface IRepository<TEntity> where TEntity : EntityBase {
TEntity FindOne(int id);
}
实现通用IRepository接口后,您需要有一个具体的Repository类,该类是从通用接口继承的,如下所示:
public class Repository<TEntity> : IRepository<TEntity> where TEntity : EntityBase {
private readonly DbContext _dbContext;
private readonly DbSet<TEntity> _dbSet;
public Repository(DbContext dbContext) {
_dbContext = dbContext;
_dbSet = _dbContext.Set<TEntity>();
}
public IQueryable<TEntity> Entities {
get { return _dbSet; }
}
public TEntity FindOne(int id) {
return Entities.FirstOrDefault(t => t.Id == id);
}
}
这很巧妙,所以正如您在这里看到的,我们期望Repository类构造函数使用DbContext参数。此外,我们还利用实体库的Id属性来找到我们想要的东西。
到目前为止,您实现了基本的Repository模式,从现在起,您需要为每个域实体创建一个Repository类。让我们实现您在这里提出的要求:
public class ProductRepository : Repository<Product> {
public ProductRepository(DbContext dbContext)
: base(dbContext) {
}
public IEnumerable<Product> GetProductList(string Type) {
IEnumerable<Product> fLit = from p in Entities select p;
return fLit;
}
}
希望得到帮助。
错误非常明显:TEntity不是产品。在.Net 4.0中,您可以使用协方差来修复此问题,但在.Net 3.5中,您可能会执行以下操作:
- 将类型约束从
where TEntity : class
更改为where TEntity : Product
。您已经在方法中假设了这一点,所以这样做可以使编译器强制执行它 - 使用LINQ将结果显式转换为实体:
return fLit.Cast<TEntity>();
在.NET 3.5中,不能强制转换这样的泛型类型。因此,只需将您的enumerable保留为泛型类型即可。将行更改为:
IEnumberable<TEntity> flit = from p in PRODUCT LIST select p;