2013-03-20 107 views
1

我是EF/Linq-To-SQL的新手。我之前读过SO,IQueryable比IEnumerable更有益处,因为它的评估很懒。关于以下简单示例:IQueryable评估

var records = db.Employees.Where(x => x.EmployeeID == "3"); 

if (records.Any()) 
{ 
    var topRecord = records.First(); 
} 

IQueryable表达式是否被计算两次?一次检查结果集中的任何元素,一次检索第一个元素?如果是这样,是否有更有效的方法来进行这样的选择?

回答

4

是的,在这种情况下,查询将执行两次:首先是Any,然后是First

你很可能FirstOrDefault代替:

var topRecord = db.Employees.FirstOrDefault(x => x.EmployeeID == "3"); 
// topRecord will be null if there's no match 

if (topRecord != null) 
{ 
    ... 
} 
+0

+1:删除了我的(不正确)的答案。我在评估时忽略了'Any'布尔值。 – 2013-03-20 14:57:31

+0

@LukeH编辑了你的帖子,指出在哪种情况下,FirstOrDefault只会帮助执行一个查询 – Matten 2013-03-20 14:59:00