如何在Include()用法过滤后排除属性

时间:2018-05-07 11:57:58

标签: c# entity-framework-core

为了过滤项目列表,我使用了相关属性的类型。

var list = Context.Items
    .Include(_ => _.Details)
    .Where(_ => _.Details.Kind == kind));

return list;

这将返回由 kind 过滤的完整列表,在这种情况下,由于 Details 属性很大,在每个返回的元素中精确复制(没有两个细节)同一种类型可能会有所不同),项目清单可能会很长。

因此,在 Details 中使用 kind 过滤掉正确的项目子集时,我希望该字段在返回时为空。解决它的一种方法是获取所有项目的ID,然后根据它进行选择。似乎效率低,速度慢。另一种方法是将guid迁移到类 Item 并使用它进行过滤。这似乎是数据模型的重复和侵扰。

是否有一种简洁的方法可以删除包含的属性?

我正在考虑相当于以下(不工作,无法想象)的样本。

var list = Context.Items
    .Include(_ => _.Details)
    .Where(_ => _.Details.Kind == kind));

return list.Forget(_ => _.Details);

1 个答案:

答案 0 :(得分:3)

仅当您希望结果中的导航属性数据包含 时,才需要

Include

转换为SQL的操作(如GroupByWhere)不需要使用Include,因此您可以这样做:

var list = Context.Items.Where(_ => _.Details.Kind == kind));

另一个常见错误(据我所见),IncludeSelect一起使用。当您使用Select时,所有Include都会被有效丢弃。