我正在处理一个大型项目,其他人使用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;
}
有人能看到这里可能出现的问题吗?
答案 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>
(包含表达式的结果)未实现该接口。