Рассмотрим следующий код, где dbContext
- это SQL контекст базы данных сервера, а Examples
- DbSet
:
this.dbContext.Examples.Take(5).ToList();
Enumerable.Take(this.dbContext.Examples, 5).ToList();
Первая строка работает должным образом и преобразуется в SQL следующим образом:
SELECT TOP(5) * FROM Examples
Однако вторая строка сначала извлекает все строки, а затем применяет оператор Take
. Почему?
Поскольку я использую выражения для построения динамической c лямбды, мне приходится использовать второй подход (Enumerable.Take
):
var call = Expression.Call(
typeof(Enumerable),
"Take",
new[]{ typeof(Examples) },
contextParam,
Expression.Constant(5)
);
К сожалению, первый подход не работает при работе с выражениями, а текущая архитектура программы вынуждает меня динамически строить лямбда.
Почему второй подход извлекает все строки и как я могу предотвратить это, чтобы эффективно использовать его в выражениях ?