我和父母,孩子和孙子一起有一个多人关系模特。使用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只是无法识别导航属性。
是否有正确的方式(如:低数据库交互)查询子项(以及它们是什么)?或者这是不可能的?
答案 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查询,它只返回孙子数而不是所有中间数据。