想象一下以下课程:
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Underage
{
public int Age { get; set; }
}
我做这样的事情:
var underAge = db.Underage.Select(u => u.Age) .ToList()/AsEnumerable()/AsQueryable()
var result = db.Persons.Where(p => underAge.Contains(p.Age)).ToList();
最好的选择是什么?如果我致电ToList()
,这些项目将被检索一次,但是如果我选择AsEnumerable
或AsQueryable
将在每次有人从数据库中选择一个人时执行它们Where()
(如果那是它的工作方式,那么我对数据库在后台所做的事情并不了解)?
当Underage包含数千条记录而不是少量记录时,还有更大的区别吗?
没有。
您绝对不想ToList()
在这里,因为那样会将所有匹配的值加载到内存中,然后使用它为result
其中包含大量IN (…)
子句的查询编写查询。当您真正想要的是首先从数据库中获取匹配值时,这是一种浪费,例如
SELECT *
FROM Persons
WHERE EXISTS(
SELECT NULL FROM
FROM Underage
WHERE Underage.age = Persons.age
)
AsEnumerable()
尽管提供商可能会检查源并撤消其影响,但通常会阻止在数据库上完成操作AsEnumerable()
。AsQueryable()
很好,但是在这种情况下实际上什么也没做。
您不需要任何一个:
var underAge = db.Underage.Select(u => u.Age);
var result = db.Persons.Where(p => underAge.Contains(p.Age)).ToList();
(就此而言,检查您是否确实需要ToList()
最后一行;如果要对其进行进一步的查询,可能会伤害他们,如果仅要列举结果,那是浪费的。时间和内存,如果您要存储它们或执行很多在Linq中无法完成的内存操作,那就更好了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句