Почему EF 4.1 не поддерживает сложные запросы, а также linq-to-sql?

Я нахожусь в процессе преобразования нашего внутреннего веб-приложения из Linq-To-Sql в EF CodeFirst из существующей базы данных. В последнее время меня все больше и больше раздражают ограничения Linq-To-Sql, и необходимость обновлять edmx после обновления очень взаимосвязанной таблицы базы данных, наконец, разочаровала меня настолько, что я переключился на EF.

Однако я сталкиваюсь с несколькими ситуациями, когда использование linq с Linq-To-Sql более мощно, чем последняя версия Entity Framework, и мне интересно, знает ли кто-нибудь причину этого?Большая часть этого, кажется, связана с преобразованиями. Например, следующий запрос работает в L2S, но не в EF:

        var client = (from c in _context.Clients
                      where c.id == id
                      select ClientViewModel.ConvertFromEntity(c)).First();

В L2S это правильно извлекает клиента из базы данных и преобразует его в тип ClientViewModel , но в EF это исключения говорят, что Linq to Entities не распознает метод (что имеет смысл, поскольку я его написал.

Чтобы заставить это работать в EF, мне нужно переместить select после First () ] вызов.

Другой пример - мой запрос на получение списка клиентов. В моем запросе я преобразовываю его в анонимную структуру, которая должна быть преобразована в JSON :

        var clients = (from c in _context.Clients
                       orderby c.name ascending
                       select new
                       {
                           id = c.id,
                           name = c.name,
                           versionString = Utils.GetVersionString(c.ProdVersion),
                           versionName = c.ProdVersion.name,
                           date = c.prod_deploy_date.ToString()
                       })
                       .ToList();

Не только мой Метод Utils.GetVersionString () вызывает исключение неподдерживаемого метода в EF, c.prod_deploy_date.ToString () тоже вызывает его, и это простой DateTime . Как и ранее, в чтобы исправить это, мне пришлось выполнить преобразование выбора после ToList () .


Изменить : еще один случай, который я только что пришел По всей видимости, EF не может обрабатывать предложения where, сравнивающие сущности, где у L2S нет проблем с ним. Например запрос
context.TfsWorkItemTags.Where(x => x.TfsWorkItem == TfsWorkItemEntity).ToList()

вызывает исключение, и вместо этого я должен выполнить

context.TfsWorkItemTags.Where(x => x.TfsWorkItem.id == tfsWorkItemEntity.id).ToList() 


Редактировать 2 : Я хотел добавить еще одну обнаруженную мной проблему. Судя по всему, вы не можете использовать массивы в запросах EF Linq, и это, наверное, меня больше всего раздражает. Так, например, прямо сейчас я конвертирую сущность, обозначающую версию, в int[4] и пытаюсь запросить ее. В Linq-to-Sql я использовал следующий запрос:
return context.ReleaseVersions.Where(x => x.major_version == ver[0] && x.minor_version == ver[1]
                                          && x.build_version == ver[2] && x.revision_version == ver[3])
                              .Count() > 0;

Это не удается со следующим исключением:

The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities.

Редактировать 3 : Я нашел еще один экземпляр плохой реализации Linq в EF. Ниже приведен запрос, который работает в L2S, но не работает в EF 4.1:

        DateTime curDate = DateTime.Now.Date;
        var reqs = _context.TestRequests.Where(x => DateTime.Now > (curDate + x.scheduled_time.Value)).ToList();

Это вызывает исключение ArgumentException с сообщением Аргументы DbArithmeticExpression должны иметь общий числовой тип.


Почему это так. похоже, что они понизили возможность запросов Linq в EF, чем в L2S?
9
задан Kev 29 February 2012 в 00:03
поделиться