Я нахожусь в процессе преобразования нашего внутреннего веб-приложения из 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 ()
.
context.TfsWorkItemTags.Where(x => x.TfsWorkItem == TfsWorkItemEntity).ToList()
вызывает исключение, и вместо этого я должен выполнить
context.TfsWorkItemTags.Where(x => x.TfsWorkItem.id == tfsWorkItemEntity.id).ToList()
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 должны иметь общий числовой тип.