Ошибка Linq to Entity Framework при использовании datetimeoffset - PullRequest
4 голосов
/ 02 сентября 2011

У меня странная ошибка, и я не могу ее исправить. Может кто-нибудь помочь?

Приведенный ниже код завершается ошибкой, потому что он не похож на o.ordered.DateTime.ToShortDateString() (он работает, когда эта часть закомментирована). o.ordered - это datetimeoffset. Там ошибка это дает ниже. Я пробовал несколько разных версий, таких как date и tostring вместо toshortdatestring.

LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression. 

        var BeOrders = from o in BEdb.onlineOrders
                       join s in BEdb.order_Statuses
                       on o.status equals s.ID
                       where o.custCode == pp.AccountID
                       select new DataLayer.OrderStatusItem {
                           city = o.city,
                           customersOrderRef = o.customersOrderRef,
                           date = (o.actualDelivery ?? o.plannedDelivery),
                           date1 = (o.actualCease ?? o.actualCease),
                           number = o.number,
                           ordered = o.ordered.DateTime.ToShortDateString(),
                           postCode = o.postCode,
                           status = s.status,
                           stockCode = o.stockCode,
                           UpdatedByAccount = o.UpdatedByAccount
                       };

Ответы [ 3 ]

7 голосов
/ 02 сентября 2011

Поставщик данных, используемый для перевода кода LINQ в SQL, не понимает ToShortDateString.Из-за этого вы не можете использовать его в запросе LINQ, который отправляется в базу данных.Вы должны вызвать этот метод после того, как данные были возвращены из базы данных:

    var BeOrders = (from o in BEdb.onlineOrders
                   join s in BEdb.order_Statuses
                   on o.status equals s.ID
                   where o.custCode == pp.AccountID
                   select new {
                       city = o.city,
                       customersOrderRef = o.customersOrderRef,
                       date = (o.actualDelivery ?? o.plannedDelivery),
                       date1 = (o.actualCease ?? o.actualCease),
                       number = o.number,
                       ordered = o.ordered,
                       postCode = o.postCode,
                       status = s.status,
                       stockCode = o.stockCode,
                       UpdatedByAccount = o.UpdatedByAccount
                   }).ToList()
                     .Select(x => new DataLayer.OrderStatusItem {
                       city = x.city,
                       customersOrderRef = x.customersOrderRef,
                       date = x.date,
                       date1 = x.date1,
                       number = x.number,
                       ordered = x.ordered.DateTime.ToShortDateString(),
                       postCode = x.postCode,
                       status = x.status,
                       stockCode = x.stockCode,
                       UpdatedByAccount = x.UpdatedByAccount
                   };

Кстати: есть другое решение, которое производит более короткий код:

    var BeOrders = (from o in BEdb.onlineOrders
                   join s in BEdb.order_Statuses
                   on o.status equals s.ID
                   where o.custCode == pp.AccountID
                   select new { o, s }).ToList()
                   .Select(x => new DataLayer.OrderStatusItem
                   {
                       city = x.o.city,
                       customersOrderRef = x.o.customersOrderRef,
                       date = (x.o.actualDelivery ?? x.o.plannedDelivery),
                       date1 = (x.o.actualCease ?? x.o.actualCease),
                       number = x.o.number,
                       ordered = x.o.ordered.DateTime.ToShortDateString(),
                       postCode = x.o.postCode,
                       status = x.s.status,
                       stockCode = x.o.stockCode,
                       UpdatedByAccount = x.o.UpdatedByAccount
                   };

Разница между этими двумяверсиями является то, что первая версия запрашивает только те столбцы из базы данных, которая вам нужна, тогда как вторая версия будет возвращать все столбцы двух таблиц.

2 голосов
/ 02 сентября 2011

Простого решения не существует. В LINQ to Entities вы не можете использовать много стандартных методов, таких как преобразования. Обычно вы просто делаете все возможное в запросе, затем вызываете ToList, и затем вы можете использовать любой метод, который захотите.

1 голос
/ 04 сентября 2013

Альтернативой ToShortDateString является использование EntityFunctions.TruncateTime (o.ordered.DateTime).Для этого потребуется пространство имен для добавления System.Data.Objects.

Также преобразование в Tolist () сначала загрузит данные в память, а затем применит к ним условия, в которых, как и до применения Tolist (), будет выполняться преобразование.запрос к БД, если это IQueryable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...