它是更好的附加查询还是在客户端中获取所有数据并进行过滤?

时间:2018-11-16 12:43:07

标签: c# entity-framework-core

我有一个使用EF Core的查询,我想在其中包含一个属性,并且从该属性中它是一个ICollection,我想过滤要获取的数据。

是这样的:

myDbContext.MyEntity.Where(x => x.ID == 1).Include(x => x.MyCollection.Where(y => y.isEnabled == true));

但是,我收到一个错误消息,因为无法过滤包含的属性。

实际上,集合中的项目将很少,大约为6或7,因此我一直认为我可以包含所有项目,然后在客户端中过滤数据。

另一个选择是先获取主要实体,然后在第二个查询中获取我真正需要的孩子。

我总是读到与数据库的连接很昂贵,因此最好执行尽可能少的查询,但我也读到最佳实践是只获取所需的数据,而在数据库中不使用过滤器。客户端,但最好在查询中进行过滤。

但是在这种情况下,使用EF Core,看来我无法在查询中进行过滤,所以我想知道有什么更好的选择:2个查询并仅获取我需要的数据,或者一个查询将所有数据并稍后在客户端中进行过滤。

1 个答案:

答案 0 :(得分:0)

  

但是在这种情况下,使用EF Core,看来我无法在查询中进行过滤,所以我想知道有什么更好的选择:2个查询并仅获取我需要的数据,或者一个查询将所有数据并稍后在客户端中进行过滤。

哪个更长?一长串还是两短串?

您不知道,因为我没有告诉您实际的长度。您不知道这是1m弦还是2个5cm弦还是10cm弦还是8cm弦。

这里的问题是相同的。少查询比多查询好,而短查询比长查询好。如果仅选择那些指标之一(例如,对数据库进行简单Where的查询比对所有结果在内存中进行简单的Where的查询要短),那么我们可以使声音 a先验判断可能更有效,然后做出相应选择。

尽管我们有竞争因素在起作用,但我们必须:

  1. 确定我们是否在乎:如果它们仍然会非常快,无论哪种方式,都不必担心。寻找更大的鱼进行油炸。

  2. 测量。

  3. 确保我们要测量的内容是现实的。

第三点很重要,因为一个人通常可以创建使一个胜出的数据集,而其他数据可以使另一个获胜。我们需要确保我们正确地模拟了现实生活中遇到的情况。

当差异很小时,或者两者兼而有之(和/或使用非常罕见,以至于仍然不是什么大问题),那么就去比较容易编码和维护的那一个。