Include
загружается очень активно и заполняет свойства навигации в реальных объектах без необходимости проецирования на не тип объекта - этого нельзя достичь с помощью объединений.Также Include
использует левые внешние объединения, тогда как ваш запрос использует внутренние объединения, поэтому вы не получите сущности, у которых нет связанных сущностей.
В EFv1 и EFv4 Include
- это метод ObjectQuery
.Я написал этот ответ , используя EFv4.1, который содержит метод расширения для IQueryable<T>
, а также Includes
с лямбда-выражением.Вы можете попробовать это - это просто еще одна библиотека, с которой вы будете ссылаться на свой проект, и вы все равно сможете использовать EFv4.
Причина переноса Включить в пользовательский метод - не вводить зависимость от EF вверхний слой.Если вы не загружаете EFv4.1, вы можете использовать это:
public static IQueryable<T> IncludeMultiple<T>(this IQueryable<T> query, params string[] includes)
where T : class
{
if (includes != null)
{
var objectQuery = query as ObjectQuery;
if (objectQuery == null)
{
throw new InvalidOperationException("...");
}
objectQuery = includes.Aggregate(objectQuery,
(current, include) => current.Include(include));
}
return objectQuery;
}
Большим недостатком в обоих подходах (EFv4 и EFv4.1) является приведение к ObjectQuery (EFv4.1 делает это внутренне) - этоможет стать серьезной проблемой в модульных тестах, когда вы не работаете с реальными запросами.