【发布时间】:2011-07-07 23:56:24
【问题描述】:
当您在 Linq-to-SQL 中查询模型对象的 EntitySet 属性时,它会返回实体集中的所有行并在客户端执行任何进一步的查询。
这在网上的一些地方得到了证实,我自己也观察到了这种行为。 EntitySet 没有实现 IQueryable。
我所要做的就是转换如下代码:
var myChild = ... ;
// Where clause performed client-side.
var query = myChild.Parents().Where(...) ;
到:
var myChild = ... ;
// Where clause performed in DB and only minimal set of rows returned.
var query = MyDataContext.Parents().Where(p => p.Child() == myChild) ;
有人知道更好的解决方案吗?
第二个问题:实体框架中是否已解决此问题?
【问题讨论】:
-
我不知道为什么我没有得到答案,尤其是来自微软的人。这似乎并不重要,但实际上它妨碍了首选的范围数据访问编码风格。例如,如果要将数据范围限制为当前用户拥有的对象,则可以使用:theUser.Products().Where(...) 而不是 DataContext.Products().Where(p => p .User() == theUser).Where(...)。使编码重复并且更有可能引入错误。与 Rails ActiveRecord 对比:guides.rubyonrails.org/association_basics.html#why-associations.
标签: linq-to-sql linq-to-entities