Разве Entity Framework не может использовать не-сущностные классы в запросе? - PullRequest
1 голос
/ 07 декабря 2010

Я пытаюсь определить, делаю ли я что-то не так, или Entity Framework просто не предназначен для этого. Я хочу выполнить запрос в стиле LINQ для заполнения объекта, включая списки дочерних элементов. В Linq2SQL это допустимо и преобразуется в эффективный SQL-запрос, результаты которого заполняют новый список.

class ReportItem
{
    string Manager; /* ... */ 
    List<string> Employees; /* ... */
}

var report = (from manager in entities.Managers
                select new ReportItem()
                {
                    Manager = manager.Name,
                    Employees = manager.Employees.Select(e => e.Name).ToList()
                }).ToList();

В Entity Framework строка Employees приведет к ошибке method cannot be translated into a store expression - Entity Framework, похоже, не нравится конструировать не-сущностные классы внутри оператора LINQ, даже если она не использует никакой логики на стороне базы данных.

Я понимаю, что для отслеживания изменений используются классы сущностей, но нельзя ли прочитать информацию в произвольные классы? Я не хочу создавать сущности и представления базы данных для каждого возможного сценария чтения, и я не хочу отправлять половину базы данных через канал (целые сущности Employee или Manager) просто для считывания чего-то вроде свойства name.

Можно ли выполнить этот «ленивый, но эффективный» запрос с помощью Entity Framework или Entity Framework просто не создан с учетом этого? Я уже сталкивался с рядом проблем, связанных с преобразованием проекта из Linq2SQL в Entity Framework, и это действительно может привести к гибели.

1 Ответ

1 голос
/ 07 декабря 2010

LINQ to Entities поддерживает только беспараметрические конструкторы и инициализаторы.
Чтобы быть более конкретным, по своей конструкции LINQ to Entities требует, чтобы все выражение запроса LINQ было преобразовано в запрос сервера.Только несколько некоррелированных подвыражений (выражения в запросе, которые не зависят от результатов с сервера) оцениваются на клиенте до перевода запроса.Произвольные вызовы методов, которые не имеют известного перевода, и параметризованные инициализаторы в вашем случае поддерживаются , а не .* Проекция анонимного типа:

var report = (from manager in entities.Managers
              select new 
              {
                  Manager = manager.Name,
                  Employees = manager.Employees.Select(e => e.Name)
              })
              .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...