EF4从父母到孙子的查询

时间:2010-06-16 09:26:47

标签: entity-framework-4

我和父母,孩子和孙子一起有一个多人关系模特。使用this article我创建的POCO类工作正常,除了一件我还想不通的事情。

当我使用LINQ直接查询父母或子女时,SQL反映了LINQ查询(.Count()在数据库中执行COUNT等等) - 很好。 Parent类有一个Children属性,用于访问它的子级。但是(现在问题)这不会暴露IQueryable接口而是ICollection。因此,当我访问特定父母 all 上的Children属性时,将阅读Parent's Children。更糟糕的是,当我访问孙子(theParent.Children.SelectMany(child => child.GrandChildren).Count())时,每个孩子都会发出一个单独的请求来选择孙子孙女的所有数据。这是很多单独的查询!

将Children属性的类型从ICollection更改为IQueryable并不能解决此问题。除了缺少我需要的方法,比如Add()和Remove(),EF只是无法识别导航属性。

是否有正确的方式(如:低数据库交互)查询子项(以及它们是什么)?或者这是不可能的?

1 个答案:

答案 0 :(得分:2)

我找到的解决方法是从中间开始,在儿童:

var gc = context.Children
  .Where(c => c.Parents.Any(p => p.Id == theParent.Id))
  .SelectMany(c => c.GrandChildren);

int cnt = gc.Count();

至少这会给出一个sql查询,它只返回孙子数而不是所有中间数据。