首页 > 解决方案 > 使用 Include() 进行过滤后如何排除属性

问题描述

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

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);

标签: c#entity-framework-core

解决方案


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

转换为 SQL 的操作,比如GroupByand Where,不需要使用Include,所以你可以这样做:

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

另一个常见错误(据我所知)是使用Includewith Select。当你使用 时Select,所有Include的 s 都被有效地扔掉了。


推荐阅读