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).Часов