Как выполнить сравнение даты в запросе EF?
Пожалуйста, помогите.
Я пытаюсь выяснить, как использовать DATE или DATETIME для сравнения в запросе linq.
Пример:
Если бы я хотел, чтобы все имена Employee для тех, кто начинался до сегодняшнего дня, я бы сделал что-то вроде этого в SQL:
SELECT EmployeeNameColumn
FROM EmployeeTable
WHERE StartDateColumn.Date <= GETDATE() //Today
Но как насчет linq?
DateTime startDT = //Today
var EmployeeName =
from e in db.employee
where e.StartDateColumn <= startDT
Вышеуказанное WHERE не работает:
Сведения об исключении: System.NotSupportedException: указанный тип member 'Date' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности.
Ответы
Ответ 1
Это должно сработать. Вы уверены, что не существует другой части запроса, вызвавшего исключение? У меня есть несколько экземпляров запросов формы
var query = from e in db.MyTable
where e.AsOfDate <= DateTime.Now.Date
select e;
в моем коде.
Ответ 2
Используйте класс DbFunctions
для обрезки временной части.
using System.Data.Entity;
var bla = (from log in context.Contacts
where DbFunctions.TruncateTime(log.ModifiedDate)
== DbFunctions.TruncateTime(today.Date)
select log).FirstOrDefault();
Источник: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
Ответ 3
Возможно, это связано с тем, что дата в базе данных является нулевой. Попробуйте следующее:
var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT
Ответ 4
Вы можете проверить состояние, подобное этому
var nextDay = DateTime.Today.AddDays(1);
var query = from e in db.MyTable
where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay
select e;
здесь вы получите записи о дате AsOfDate, когда мы проверяем между сегодняшним днем (00:00:00) и tommorow (00:00:00), мы получим сегодняшнюю дату записи только того, что когда-либо может быть временем...
Ответ 5
Вы не можете использовать .Date
Если вы хотите проверить на сегодняшний день, вы можете создать дату и время без времени
DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
var e = (from mds in myEntities.Table
where mds.CreateDateTime >= myDate
select mds).FirstOrDefault();
Ответ 6
Мне любопытно сообщить сообщение об ошибке 'Date'
, когда вы передаете 'DateTime'
. Может ли быть, что 'StartDateColumn'
на самом деле является 'Date'
, а не a 'DateTime'
в базе данных? Это может испортить сравнение...
Ответ 7
попробуйте следующее:
DateTime dd = DateTime.Parse("08/13/2010 00:00:00");
var data = from n in ContributionEligibilities
where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date
select n;
data.Dump("Result") ;
Ответ 8
Я использую LinqDataSource, и у меня были проблемы с получением моего запроса с помощью сравнения даты в нем для выполнения без ошибок. Ответ заключается в использовании функции WhereAddParameters и добавлении тестового значения в качестве строго типизированного параметра.
См. пример ниже, где я сопоставляю groupid и проверяю, больше ли StopDate в моей записи, или равна дате даты/времени.
Я использую этот фрагмент кода в настоящее время, и он работает как шарм.
LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString())
LinqCampaigns.Where = "GroupId = " & myGrp & " && " & "StopDate >= @StopDate"
Работает как очарование....
Ответ 9
используйте локальную переменную для хранения значения Date, а затем используйте эту переменную в запросе:
DateTime today = DateTime.Now.Date;
from scheme in context.schemes
where scheme.EndDate > today
select scheme
Ответ 10
. Дат не работал, но .Day сделал для меня.
var query = from o in Payments
where o.Order.OrderDate.Day != o.PaymentDate.Day
orderby o.Order.OrderDate
select new
{
o.Order.OrderID,
o.Order.OrderDate,
o.PaymentDate,
o.Order.FirstName,
o.Order.LastName,
o.Order.CustomerID
};
query.Dump();
Ответ 11
убедитесь, что вы проверяете нулевое значение следующим образом:
'(from mm in _db.Calls
where mm.Professionnal.ID.Equals(proid)
&& mm.ComposedDate.HasValue &&
(mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date)
select mm).ToArray();'