在linq-to-sql查询中应该使用什么集合?可查询vs可枚举vs列表

亚历山大·德克

想象一下以下课程:

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(),这些项目将被检索一次,但是如果我选择AsEnumerableAsQueryable将在每次有人从数据库中选择一个人时执行它们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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章