首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与IEnumerable<TEntity>的问题

与IEnumerable<TEntity>的问题
EN

Stack Overflow用户
提问于 2012-01-21 17:15:42
回答 3查看 1K关注 0票数 2

我想要编写一个通用方法,它返回任何模型,如产品、销售等。类似于此(.net 3.5;我是使用实体框架的而不是)。

代码语言:javascript
复制
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>。存在显式转换(是否缺少强制转换?)

任何帮助都很感激。提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-21 18:05:01

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

代码语言:javascript
复制
public class EntityBase {
    public virtual int Id { get; set; }
}

然后必须有一个通用的IRepository接口:

代码语言:javascript
复制
public interface IRepository<TEntity> where TEntity : EntityBase {
    TEntity FindOne(int id);
}

在实现泛型IRepository接口之后,需要有一个具体的Repository类,这个类是从泛型接口继承的,如下所示:

代码语言:javascript
复制
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类。让我们在这里实现您所要求的:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-01-21 17:30:45

错误很明显: TEntity不是产品。在.Net 4.0中,您可以使用协方差来修复这个问题,但在.Net 3.5中,您可以执行以下操作:

  1. 将类型约束从where TEntity : class更改为where TEntity : Product。您已经在方法中假设了这一点,所以编译器可以强制执行它。
票数 2
EN

Stack Overflow用户

发布于 2012-01-21 17:24:59

在.NET 3.5中,您不能转换这样的泛型类型。因此,只需将您的枚举作为泛型类型。将行更改为:

代码语言:javascript
复制
IEnumberable<TEntity> flit = from p in PRODUCT LIST select p;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8954941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档