【发布时间】:2020-08-20 12:48:44
【问题描述】:
考虑以下代码,其中dbContext 是 SQL Server 数据库上下文,Examples 是 DbSet:
this.dbContext.Examples.Take(5).ToList();
Enumerable.Take(this.dbContext.Examples, 5).ToList();
第一行按预期工作,并通过以下方式转换为 SQL:
SELECT TOP(5) * FROM Examples
但是,第二行首先获取所有行,然后应用 Take 运算符。这是为什么呢?
由于我使用表达式来构建动态 lambda,我必须使用第二种方法 (Enumerable.Take):
var call = Expression.Call(
typeof(Enumerable),
"Take",
new[]{ typeof(Examples) },
contextParam,
Expression.Constant(5)
);
不幸的是,第一种方法在使用表达式时不起作用,并且程序的当前架构迫使我动态构建 lambda。
为什么第二种方法会获取所有行以及如何防止它以有效地在表达式中使用它?
【问题讨论】:
-
为什么你觉得它无效?你得到的正是你所要求的。枚举,然后过滤。没有什么低效的。这就像一个人在城市里以 150 公里/小时的速度行驶,然后抱怨他得到的罚单。
-
“因为我使用表达式来构建动态 lambda” - 不。这被称为不良程序。有办法交出一个lamba,所以不需要使用Enumerable。此外,您应该返回 IQueryable。
标签: c# sql sql-server linq