IQueryable<Customer> custs = from c in db.Customerswhere c.City == "<City>"select c;
IEnumerable<Customer> custs = from c in db.Customerswhere c.City == "<City>"select c;
我最近遇到了IEnumerable v.IQueryable的问题。使用的算法首先执行IQueryable查询以获得一组结果。然后将这些结果传递给foreach循环,将项目实例化为实体框架(EF)类。然后,该EF类被用于Linq to Entity查询的from子句中,导致结果为IEnumerable。
我对EF和Linq for Entities相当陌生,所以花了一段时间才弄清楚瓶颈是什么。使用MiniPro的,我找到了查询,然后将所有单独的操作转换为单个IQueryable Linq for Entities查询。IEnumerable花了15秒,IQueryable花了0.5秒执行。涉及三个表,阅读后,我相信IEnumerable查询实际上形成了三个表的交叉产品并过滤结果。
(3)多个活动结果集(MARS)。如果您在foreach( var record in resultSet )块中迭代IEnumerable并同时尝试访问record.childEntity.childProperty,由于数据集和关系实体的延迟加载,您可能最终会得到MARS。如果在连接字符串中未启用,这将导致异常。