itsathere Ответов: 3

LINQ to Entities не распознает систему метода.DateTime ToDateTime(System.Object)' метод, и этот метод не может быть переведен в выражение хранилища.


как получить TimeSpan вставленной даты в базе данных и DateTime.Теперь через несколько часов.

У меня есть linq
var getFacility = (from item in objDB.LabDetails
                                   select new LabDetailsModel
                                   {
                                       DetailsID = item.DetailsID,
                                       CallerName = item.CallerName,
                                       FaciltityID = item.FaciltityID,
                                       FacilityName=(from fac in objDB.Facilities.Where(a=>a.FacilityID==item.FaciltityID) select fac.FacilityName).FirstOrDefault(),
                                       ReqBarCode = item.ReqBarCode,
                                       SpecimenType = item.SpecimenType,
                                       Contact = (from fac in objDB.Facilities.Where(a => a.FacilityID == item.FaciltityID) select fac.Contact).FirstOrDefault(),
                                       CourierName=(from fac in objDB.Facilities.Where(a=>a.FacilityID==item.FaciltityID) select fac.CourierName).FirstOrDefault(),
                                       RequiredTesting = item.RequiredTesting,
                                       RequiredTestingStat = item.RequiredTestingStat,
                                       ConfirmationCode = item.ConfirmationCode,
                                       Representative = item.Representative,
                                       DeliveryType=item.DeliveryType,
                                       DeliveryTypeName = item.DeliveryType == 1 ? "1 hour" : item.DeliveryType == 2 ? "2 hour" : item.DeliveryType == 3 ? "OverNight" : item.DeliveryType == 4 ? "Ground" : item.DeliveryType == 5?"2 Day":"None",
                                       Reference = item.Reference,
                                       Notes = item.Notes,
                                       OrderingPhysicianType = item.OrderingPhysicianType,
                                       PhysicianName = (from fac in objDB.Facilities.Where(a => a.FacilityID == item.FaciltityID) select fac.PhysicianName).FirstOrDefault(),
                                       CreatedDate = item.CreatedDate.Value,
                                       ReceiveDate=(from recv in objDB.ReceiveSpecimen.Where(a=>a.LabDetailsID==item.DetailsID) select recv.ReceiveDate).FirstOrDefault(),
                                       ReceivedBy = (from recv in objDB.ReceiveSpecimen.Where(a => a.LabDetailsID == item.DetailsID) select recv.ReceivedBy).FirstOrDefault(),
                                       ReceiveNote = (from recv in objDB.ReceiveSpecimen.Where(a => a.LabDetailsID == item.DetailsID) select recv.ReceiveNote).FirstOrDefault(),
                                       DeliveryLateTime = (DateTime.Now - Convert.ToDateTime(item.CreatedDate)).Hours,
                                   }).OrderByDescending(a=>a.DetailsID).ToList();
                return getFacility;

Он показывает ошибку "LINQ to Entities не распознает систему метода".DateTime ToDateTime(System.Object)' метод, и этот метод не может быть переведен в выражение хранилища." Я думаю, что ошибка происходит из-за
Convert.ToDateTime(item.CreatedDate)
но не смог найти точное решение после многих поисков.


Спасибо.

virusstorm

Во-первых, у вас есть много тегов на этом, убедитесь, что вы добавляете только соответствующие теги. Во-вторых, каков тип предмета.Дата создания?

itsathere

тип элемента.CreatedDate - это дата и время. На самом деле, без использования TimeSpan может быть невозможно получить разницу, и в linq, если я ее реализую, кодирование будет сложным, поэтому я использую другой статический метод, чтобы получить точную разницу.

Richard Deeming

Если тип уже есть DateTime- тогда тебе не нужно звонить Convert.ToDateTime вообще.

itsathere

Я использую модель для вставки, обновления данных, и модель похожа на приведенный ниже код
публичная Дата-Время? CreatedDate { get; set; }

после этого я использую его.
перед использованием конвертации.ToDateTime он показывает из-за своего типа DateTime?

Richard Deeming

В этом случае используйте либо item.CreatedDate.Value или item.CreatedDate.GetValueOrDefault().

Первый вызовет исключение, если CreatedDate является null, что является тем же самым поведением, что и Convert.ToDateTime метод.

Последний вернется DateTime.MinValue если CreatedDate является null.

itsathere

Я проверил, что база данных CreatedDate не является нулевой, а также проверил, как элемент.CreatedDate.Значение, но все равно ошибка та же

johannesnestler

Вы должны понять, как Linq-провайдеры (Linq to Entities в вашем случае) и как работают деревья выражений... в любом случае в вашем случае просто подготовьте преобразованный объект datetime вне выражения и используйте эту (захваченную) переменную внутри Linq-выражения.

itsathere

уточните, пожалуйста..

virusstorm

Вам нужно сделать что-то вроде этого:

//Использовать, если CreatedDate не может быть обнулен
var timeAgo = TimeAgo (item.CreatedDate);

//Использовать если CreatedDate допускает значения null
var timeAgo = TimeAgo (item.CreatedDate.GetValueOrDefault());

Затем в своем заявлении linq сделайте следующее:

DeliveryLateTime = timeAgo,

Как говорил Йоханнес Нестлер, linq работает так, что компилятор берет оператор, преобразует его в дерево выражений и затем вычисляет. В результате есть ограничения относительно того, что вы можете сделать. Взгляните на эту ссылку для получения более подробной информации.
https://msdn.microsoft.com/en-us/library/bb397951.aspx

Sascha Lefèvre

Если вы не можете решить проблему с уже опубликованными комментариями, пожалуйста, включите фактический запрос Linq, который вы пытаетесь выполнить здесь. (Пожалуйста, используйте ссылку "улучшить вопрос" под вашим вопросом, чтобы вставить его туда.)

itsathere

Я обновил фактический linq.
теперь мне нужна часовая разница между двумя датами и временем, используя приведенный ниже код
DeliveryLateTime = (DateTime.Теперь-Обращайся.ToDateTime(пункт.CreatedDate)).Часов,

Sascha Lefèvre

Вы уже пробовали это?
DeliveryLateTime = (DateTime.Теперь-пункт.CreatedDate).Часов

3 Ответов

Рейтинг:
2

D V L

У меня тоже есть такая же проблема

Итак, я использовал "DbFunctions".

попробовать это.

https://msdn.microsoft.com/en-US/library/system.data.entity.dbfunctions.diffhours(v=против 113). aspx[^]


Рейтинг:
1

Maciej Los

С первого взгляда...

Похоже у вас есть только один вариант:

SqlFunctions.DateDiff("h", item.CreatedDate, DateTime.Now)


Для получения более подробной информации, пожалуйста, смотрите: SqlFunctions.Способ Функция Datediff [^]

Опционально, как Саша Лефевр[^] предложил, Вы можете попробовать что-то вроде этого:
DeliveryLateTime = (DateTime.Now - item.CreatedDate).Hours,


Рейтинг:
1

Sinan Ergin

У вас есть тип возврата ?

Я просто догадываюсь, и у меня есть решение.
Братан, ты можешь посмотреть ниже,

DeliveryLateTime = DateTime.Now.TimeOfDay.Subtract(item.CreatedDate) 
//If DeliveryLateTime is type as TimeSpan

//OR

DeliveryLateTime = DateTime.Now.TimeOfDay.Subtract(item.CreatedDate).Hours
//If DeliveryLateTime is type as int


Dave Kreskowiak

Этому вопросу уже больше года. Я сомневаюсь, что ОП все еще ищет ответ.