为了过滤项目列表,我使用了像这样的相关属性的类型。
var list = Context.Items
.Include(_ => _.Details)
.Where(_ => _.Details.Kind == kind));
return list;
这将返回按种类筛选的完整列表,在这种情况下,这是相当糟糕的,因为Details属性很大,在每个返回的元素中精确地重复(没有两个相同类型的细节可以不同),并且项目列表可能很长。
因此,在详细信息中使用kind来过滤掉正确的项目子集时,我希望该字段在返回时为空。解决该问题的一种方法是获取所有项目的 ID,然后基于此进行选择。似乎效率低下且缓慢。另一种方法是将 guid 迁移到类项中,并将其用于筛选。对于数据模型来说,这似乎是重复和侵入性的。
有没有一种巧妙的方法可以删除包含的属性?
我正在考虑一个等效于以下(不起作用,富有想象力的)示例。
var list = Context.Items
.Include(_ => _.Details)
.Where(_ => _.Details.Kind == kind));
return list.Forget(_ => _.Details);
仅当您希望该导航属性的数据包含在结果中时才需要Include
。
翻译成SQL的操作,如GroupBy
和Where
,不需要使用Include
,所以你可以做:
var list = Context.Items.Where(_ => _.Details.Kind == kind));
另一个常见的错误(据我所知),是将Include
与Select
一起使用。当你使用Select
时,所有的Include
都被有效地扔掉了。