实体框架存储库不能与多级.Include()一起使用

时间:2014-10-13 21:05:02

标签: c# entity-framework generics repository

我正在处理一个大型项目,其他人使用Entity Framework设置了Repository类。我意识到一些问题可能与自定义代码有关,但任何人都可以帮我确定下一步的位置吗?

我试图写这个查询:

List<ProductItem> addedProductItems =
    repository.Query<ProductItem>()
        .Include(pi => pi.Product)
        .Include(pi => pi.ProductItemVendors.Select(v => v.ProductPricings))
        .Where(pi => !pi.IsDeleted && productIdSortOrder.Keys.Contains(pi.ProductId))
        .AsEnumerable()
        .OrderBy(pi => productIdSortOrder[pi.ProductId])
        .ToList();

但是第二个.Include()的行会产生以下错误。 (第一个.Include()工作正常。):

  

错误5类型&#39; System.Collections.Generic.IEnumerable&gt;&#39;不能用作类型参数&#39; TEntity2&#39;在泛型类型或方法中,VIP.Domain.Repository.IRepositoryObjectQuery.Include(System.Linq.Expressions.Expression&gt;)&#39;。来自&#39; System.Collections.Generic.IEnumerable&gt;&#39;没有隐式引用转换。到&#39; Leo.Domain.ILeoDomainModelItem&#39;。

这是定义包含Include()的界面的方式:

public interface IRepositoryObjectQuery<TEntity, TEntityMarker>
    : IOrderedQueryable<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, IOrderedQueryable, IQueryable, IEnumerable, IListSource
    where TEntity : TEntityMarker
{
    IRepositoryObjectQuery<TEntity, TEntityMarker> Include<TEntity2>(IRepositoryPropertyChain<TEntity, TEntity2> propertyChain) where TEntity2 : TEntityMarker;
    IRepositoryObjectQuery<TEntity, TEntityMarker> Include<TEntity2>(Expression<Func<TEntity, TEntity2>> propertyGetter) where TEntity2 : TEntityMarker;
    IRepositoryObjectQuery<TEntity, TEntityMarker> Include<TEntity2>(Expression<Func<TEntity, ICollection<TEntity2>>> propertyGetter) where TEntity2 : TEntityMarker;
}

有人能看到这里可能出现的问题吗?

1 个答案:

答案 0 :(得分:0)

表达式的结果

pi => pi.ProductItemVendors.Select(v => v.ProductPricings)

不是ICollection<T>,可能不是IRepositoryPropertyChain,因此可以使用它的唯一重载是

IRepositoryObjectQuery<TEntity, TEntityMarker> Include<TEntity2>(
    Expression<Func<TEntity, TEntity2>> propertyGetter) 
    where TEntity2 : TEntityMarker;

由于类型约束,TEntity2必须派生自/实现TEntityMarker(显然是Leo.Domain.ILeoDomainModelItem)。 IEnumerable<TypeOfProductPricings>(包含表达式的结果)未实现该接口。