【发布时间】:2017-08-25 18:48:47
【问题描述】:
我为我的实体Master 创建了一个存储库。在存储库中,我有一个 Get 方法来使用 Entity Core 通过 Id 获取我的实体。
方法接收:
public TEntity Get(object id, params Expression<Func<TEntity, object>>[] includedRelatedEntities)
{
return GetById(IncludeEntities(DBContext.Set<TEntity>().AsQueryable(), includedRelatedEntities), id);
}
然后,当我在我的代码中使用它时,我只需将我正在寻找的实体的 ID 和我需要包含在查询中的相关实体的表达式树传递给该方法 (Expression<Func<TEntity, object>>)
使用示例如下:
var master = MasterRepository.Get(1, x => x.BranchOffice.Location);
在这种情况下,我正在寻找 Id = 1 的 Master,我希望它包含 BranchOffice 相关实体和与 BranchOffice 相关的 Location。
从一对多关系,它工作正常,但对于相关列表,我不知道如何使用表达式来解决它。
例如,如果我想包含与我的Master相关的Detail列表中名为Details的Product实体,我不知道如何在表达式树中表达。
var master = MasterRepository.Get(1, x => x.Details.Product);
Details 是一个列表,所以我无法访问上面示例中的产品。
如何在Expression<Func<TEntity, object>> 中表达这一点?
编辑:
我已经试过了:
var master = MasterRepository.Get(1, x => x.Details.Select(y=> y.Product));
但我得到以下异常:
属性表达式'x => {from Detail y in [x].Details select [y].Product}' 无效。表达式应该代表一个属性 访问:'t => t.MyProperty'。有关包括相关的更多信息 数据,请参阅 go.microsoft.com/fwlink/?LinkID=746393。'
【问题讨论】:
-
请尝试使用
Select获取相关Product以获取所有详细信息:var master = MasterRepository.Get(1, x => x.Details.Select(detail => detail.Product)); -
@GeorgeAlexandria 我已经尝试过了,但我遇到了一个异常:'属性表达式'x => {from Detail y in [x].Details select [y].Product}' 不是有效的。该表达式应表示属性访问:'t => t.MyProperty'。有关包含相关数据的更多信息,请参阅go.microsoft.com/fwlink/?LinkID=746393。'
-
哦,我明白了,他们改变了
Entity.Core中嵌套子项的检索... -
你能解释一下返回
IncludeEntities是什么吗?它是否返回IQueryable?
标签: c# lambda expression-trees