2016-06-14 4 views
8

Мне интересно, если я использую несколько методов Where(...) один за другим, является EntityFramework достаточно умным, чтобы объединить его в результирующем запросе. Скажем, у меня есть:EntityFramework Multiple Where

context.Items 
    .Where(item => item.Number > 0) 
    .Where(item => item.Number < 5) 
    .ToList(); 

ли результирующий SQL-запрос будет таким же, как если бы я написать:

context.Items 
    .Where(item => item.Number > 0 && item.Number < 5) 
    .ToList(); 

Есть ли за кадром оптимизаций для нескольких Где статья?

+0

Они оба должны перевести на тот же SQL для любого крупного поставщика. Вы всегда можете попробовать оба и посмотреть, что производит каждый SQL. –

+1

Да, многократное, где условия соединения с && (которые вы могли бы проверить самостоятельно примерно через минуту). – Evk

+0

@Evk Я не смог проверить оптимизацию сахара JIT или синтаксиса быстро, не копаясь в документах и ​​IL, хотя. Посмотрите мой последний вопрос. Благодарю. – Andrei

ответ

5

Да, есть. Это не Entity Framework, которая делает это. На самом деле задача поставщика поставщика SQL заключается в составлении запроса для базы данных. В зависимости от используемой базы данных этот код будет из разных источников.

Для MSSQL код находится в Microsoft и находится в библиотеке System.Data.SqlClient. Если вы посмотрите на свой элемент соединения в вашем web.config, вы должны заметить атрибут «имя поставщика».

Внутри этой библиотеки или подобных ей библиотек часто используется шаблон рекурсивного посетителя для навигации по определенному графу объектов дерева выражений, чтобы обеспечить наиболее эффективный запрос.

Использование множеств, где клаузулы очень легко обнаружить и оптимизировать, место, в котором такие библиотеки сталкиваются с проблемами, как правило, связано с глубоко вложенными проекциями.

Вы можете увидеть SQL, полученный с помощью запроса, если вы используете

context.Items 
.Where(item => item.Number > 0) 
.Where(item => item.Number < 5) 
.ToString(); 
+0

Спасибо за ваш ответ! – Andrei