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。存在显式转换(是否缺少强制转换?)

感谢您的帮助。提前谢谢。

Issue with IEnumerable<TEntity>

恐怕您必须更改域的设计,存储库模式不是这样实现的。首先,你必须为你的域模型有一个基类,如下所示(当然这不是必要的):

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中,您可能会执行以下操作:

  1. 将类型约束从where TEntity : class更改为where TEntity : Product。您已经在方法中假设了这一点,所以这样做可以使编译器强制执行它
  2. 使用LINQ将结果显式转换为实体:return fLit.Cast<TEntity>();

在.NET 3.5中,不能强制转换这样的泛型类型。因此,只需将您的enumerable保留为泛型类型即可。将行更改为:

IEnumberable<TEntity> flit = from p in PRODUCT LIST select p;