C# 在sql中而不是内存中进行IEnumerable过滤?

C# 在sql中而不是内存中进行IEnumerable过滤?,c#,C#,我看到很多帖子都在谈论IEnumerable它在内存中应用过滤,而不是像IQueryable那样在SQL server中应用过滤 但是, 我的表有20条记录,其中只有一条Id为“12345” 当我这样做的时候 IEnumerable<Customer> customer = _context.Customer.where(x => x.Id== '12345'); 它将返回1条记录。此时,您在IQueryable界面上执行where。(请记住,=的右侧比左侧更早执行) 注意,

我看到很多帖子都在谈论
IEnumerable
它在内存中应用过滤,而不是像
IQueryable
那样在SQL server中应用过滤

但是,

我的表有20条记录,其中只有一条Id为“12345”

当我这样做的时候

IEnumerable<Customer> customer = _context.Customer.where(x => x.Id== '12345');

它将返回1条记录。

此时,您在IQueryable界面上执行
where
。(请记住,
=
的右侧比左侧更早执行)


注意,在后两种情况下,您首先将其强制转换为
IEnumerable
,然后执行更具体的
,其中

不返回任何行。它返回一个表达式,在迭代结果时将对该表达式求值。该表达式包含一个“where”子句,该子句将包含在该评估中。您对“延迟执行”的含义有误解。这并不意味着所有20行都将返回。想想在实体框架中编写的每一个查询都会有多昂贵。它的意思是,您的查询只是一个查询。只有通过某种形式的迭代强制执行它,它才会被执行——无论是
foreach
ToList
ToArray
,等等。还要注意的是,仅仅因为
customer
被声明为类型
IEnumerable
,并不意味着它不能持有
IQueryable
IQueryable
实现了
IEnumerable
:因此,无论您是否将其视为
IEnumerable
,在您的示例中,底层对象都是
IQueryable
。aaah这就是我遗漏的一点。基本上,用Where子句编写一行IEnumerable实际上意味着上面提到的两行查询。所以过滤是在内存中的IEnumerable,对吗?这就是我得到1条过滤记录而不是20条的原因。对吗?
var result = customers.ToList(); 
IEnumerable<Customer> customer = _context.Customer.Where(x => x.Id == 12345);
IEnumerable<Customer> customers = _context.Customer
IEnumerable<Customer> clientFiltered = customers.Where(x => x.Id == 12345);
_context.Customer.AsEnumerable().Where(x => x.Id == 12345);