【发布时间】:2017-03-30 02:05:58
【问题描述】:
我看到很多帖子都在谈论 IEnumerable,它在内存中应用过滤,而不是像 IQueryable 这样的 SQL 服务器。
但是,
我的桌子有20 records 和only one has Id = '12345'。
当我这样做时
IEnumerable<Customer> customer = _context.Customer.where(x => x.Id== '12345');
它返回1 行和not of 20 行。
为什么?
我的理解是它最初会返回 20 行,稍后我会返回
var result = customers.ToList();
它将返回 1 条记录。
【问题讨论】:
-
它不返回任何行。它返回一个表达式,当您迭代结果时将对其进行评估。该表达式包含一个“where”子句,该子句将包含在该评估中。
-
您对“延期执行”的含义有误解。这并不意味着将返回所有 20 行。想想曾经用 Entity Framework 编写的每个查询,这将是多么昂贵。它的意思是您的查询就是:一个查询。在您通过某种形式的迭代强制执行它之前,它不会被执行——无论是
foreach、ToList、ToArray等等。 -
还要注意,仅仅因为
customer被声明为IEnumerable<Customer>类型并不意味着它不能容纳IQueryable<Customer>。IQueryable<T>实现IEnumerable<T>: msdn.microsoft.com/en-us/library/… 所以不管你是否把它当作IEnumerable<Customer>,在你的例子中,底层对象都是IQueryable<Customer>。
标签: c#