IEnumerable <tentity> </tentity>的问题

时间:2012-01-21 17:15:42

标签: c# .net entity-framework

我想写一个常用的方法来返回任何模型,如产品,销售等。像这样的东西(.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>'隐式转换为   System.Collections.Generic.IEnumerable<TEntity>。存在显式转换(您是否错过了演员?)

任何帮助表示赞赏。提前谢谢。

3 个答案:

答案 0 :(得分:2)

错误非常明确:TEntity不是产品。在.Net 4.0中,您可以使用协方差来解决此问题,但在.Net 3.5中,您可以执行以下操作:

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

答案 1 :(得分:2)

我担心你必须改变域的设计,这不是Repository Pattern要实现的方式。首先,您必须为您的域模型提供一个基类,如下所示(当然这不是必需的):

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);
    }
}

这很简洁,所以你可以在这里看到我们期望Rebock类构造函数的DbContext参数。我们还利用我们的实体库的Id属性来查找我们想要的内容。

到目前为止,您实现了Repository模式的基础知识,从现在开始,您需要为每个Domain Entity创建一个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;
    }
}

希望得到这个帮助。

答案 2 :(得分:0)

在.NET 3.5中,您无法转换类似的泛型类型。所以只需将您的枚举保存为泛型类型即可。将行更改为:

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