如何在EF查询中执行日期比较?

时间:2009-07-06 17:27:53

标签: c# linq datetime linq-to-entities datetime-comparison

请帮忙。 我试图弄清楚如何在linq查询中使用DATE或DATETIME进行比较。

实施例: 如果我想要今天之前开始的所有员工姓名,我会在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:LINQ to Entities中不支持指定的类型成员“Date”。仅支持初始化程序,实体成员和实体导航属性。

11 个答案:

答案 0 :(得分:73)

使用班级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/

答案 1 :(得分:18)

那应该有用。您确定查询的其他部分没有触发异常吗?我有几个表格

的查询实例
var query = from e in db.MyTable
            where e.AsOfDate <= DateTime.Now.Date
            select e;

在我的代码中。

答案 2 :(得分:10)

可能是由于数据库中的日期可以为空。试试这个:

var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT 

答案 3 :(得分:8)

你可以检查这样的条件

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)之间进行检查,我们只得到今天的日期记录。

答案 4 :(得分: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();

答案 5 :(得分:2)

当您传递'Date'时,我很想知道'DateTime'的错误消息。可能'StartDateColumn'实际上是'Date',而不是数据库中的'DateTime'吗?这可能搞砸了比较......

答案 6 :(得分:2)

试试这个:

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") ;

答案 7 :(得分:1)

我正在使用LinqDataSource,我在使用日期比较查询时遇到问题,无错误地执行。答案是使用WhereAddParameters函数并将测试值添加为强类型参数。

请参阅下面的示例,其中我匹配groupid并检查我的记录中的StopDate是否大于或等于now的时间戳。

我目前正在使用此代码片段,它就像一个魅力。

LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString())
LinqCampaigns.Where = "GroupId = " & myGrp & " &&  " & "StopDate >= @StopDate"

像魅力一样......

答案 8 :(得分:1)

使用局部变量存储Date值,然后在查询中使用该变量:

DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

答案 9 :(得分:0)

。日期不起作用,但 .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();

答案 10 :(得分:0)

确保您像这样检查空值:

 '(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();'