Использование лямбда-метода Include в скомпилированном запросе LINQ - PullRequest
11 голосов
/ 17 ноября 2011

В настоящее время я пытаюсь оптимизировать некоторые запросы LINQ в моей программе, предварительно скомпилировав их. Некоторые из этих запросов широко используют готовую загрузку; вот пример одного:

public static Func<DatabaseEntities, string, IQueryable<Employee>> GetAllByName =
              CompiledQuery.Compile<DatabaseEntities, string, IQueryable<Employee>
              ((context, name) => context.Employees
                     .Include(e => e.Email)
                     .Where(e => e.LastName == name));

Пример использования:

var employees = GetAllByName(dbContext, "Bob").ToList();

К сожалению, попытка использовать это приводит к следующей ошибке:

LINQ to Entities не распознает метод 'System.Linq.IQueryable [Employee] Включить [Employee, Email] (System.Linq.IQueryable [Employee], System.Linq.Expressions.Expression [System.Func [Employee, Email]]) ', и этот метод нельзя перевести в выражение магазина.

Я заметил, что обычный метод активной загрузки (Include (string)) отлично работает в предварительно скомпилированном запросе. Есть ли способ использовать лямбда-версию?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Короче, нет.

Нельзя использовать лямбду в предварительно скомпилированном операторе / запросе linq.

1 голос
/ 20 ноября 2011

Вы можете редактировать код прекомпиляции, например:

public static Func<DatabaseEntities, string, IQueryable<Employee>> GetAllByName =
              CompiledQuery.Compile<DatabaseEntities, string, IQueryable<Employee>
              ((context, name) => context.Employees
                     .Include("Email")
                     .Where(e => e.LastName == name));
...