2015-09-15 4 views
0

Это более технический (за кулисами EF) вопрос для лучшего понимания Include для моего собственного.Характеристики Entity Framework включают

Делает запрос быстрее до Include другой таблицы при использовании инструкции Select в конце?

ctx.tableOne.Include("tableTwo").Where(t1 => t1.Value1 == "SomeValueFor").Select(res => new { 
    res.Value1, 
    res.tableTwo.Value1, 
    res.tableTwo.Value2, 
    res.tableTwo.Value3, 
    res.tableTwo.Value4 
}); 

Может ли это зависеть от количества значений, включенных в таблицу?

В приведенном выше примере 4 из 5 значений взяты из таблицы included. Интересно, имеет ли он какое-либо влияние на производительность. Даже хороший или плохой?

Итак, мой вопрос: что делает EF за кулисами и есть ли какой-либо предпочтительный способ использовать Include, зная все значения, которые я выберет раньше?

+0

Насколько я знаю, то 'Include' не будут игнорироваться выполнять, так как вы выбираете анонимный объект без отношения к 'tableTwo' – Rob

ответ

1

В вашем случае не имеет значения, используете ли вы Include(<relation-property-name>) или нет, потому что вы не материализуете значения до Select(<mapping-expression>). Если вы используете SQL Server Profiler (или другой профайлер), вы можете видеть, что EF генерирует два точно одинаковых запроса.

Причина этого заключается в том, потому что данные не материализовались в памяти до Select - вы работаете на IQueryable, что означает EF будет генерировать запрос SQL в конце (перед вызовом First(), Single(), FirstOrDefault(), SingleOrDefault(), ToList() или используйте коллекцию в заявлении foreach). Если вы используете ToList() до Select(), он материализует сущности из базы данных в вашу память, где будет вставлено Include(), чтобы не делать N + 1 запросов при доступе к вложенным свойствам в другие таблицы.

0

Речь идет о том, как вы хотите, чтобы EF загружал ваши данные. Если вы хотите, чтобы данные A Table были предварительно заполнены, чем использование Include. Удобнее, если таблица операторов Include будет использоваться чаще, и она будет немного медленнее, так как EF должен загрузить всю соответствующую дату перед началом работы. Прочтите разницу между загрузкой Lazy и Eager. с помощью Include, это будет интенсивная загрузка, где данные будут предварительно заполнены, а с другой стороны EF отправит вызов во вторичную таблицу при проецировании i-e Lazy loading.

0

Я согласен с @ Karamfilov за его общую дискуссию, но в вашем примере ваш запрос не может быть самым результативным. На производительность могут влиять многие факторы, такие как индексы, присутствующие в таблице, но вы всегда должны помогать EF в генерации SQL. Метод Include может создавать SQL, который включает все столбцы таблицы, вы всегда должны проверять, что такое сгенерированный SQL, и проверить, можете ли вы получить лучший, используя Join.

В данной статье описываются методы, которые могут быть использованы, и какое влияние они оказывают на производительность: https://msdn.microsoft.com/it-it/library/bb896272(v=vs.110).aspx

Смежные вопросы