53

请帮忙。我试图弄清楚如何在 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 不支持指定的类型成员“日期”。仅支持初始化程序、实体成员和实体导航属性。

4

11 回答 11

86

使用该类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/

于 2012-03-09T23:25:10.757 回答
21

那应该行得通。您确定没有触发异常的查询的另一部分吗?我有几个表单查询实例

var query = from e in db.MyTable
            where e.AsOfDate <= DateTime.Now.Date
            select e;

在我的代码中。

于 2009-07-06T17:32:52.050 回答
10

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

var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT 
于 2009-07-06T17:38:31.103 回答
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)和明天(00:00:00)之间进行检查,我们将仅获得今天的日期记录,可能是时间......

于 2011-07-06T13:22:13.967 回答
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();
于 2009-07-09T12:49:07.803 回答
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") ;
于 2010-08-13T21:21:07.857 回答
2

我很好奇错误消息说'Date',当你传递一个'DateTime'. 难道这'StartDateColumn'实际上是数据库中的 a 'Date',而不是 a 'DateTime'?这可能会混淆比较...

于 2009-07-06T17:33:39.600 回答
1

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

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

于 2011-04-17T05:59:19.380 回答
1

我正在使用 LinqDataSource,但在获取带有日期比较的查询时遇到了问题,以便在没有错误的情况下执行。答案是使用 WhereAddParameters 函数并将测试值添加为强类型参数。

请参阅下面的示例,其中我匹配一个 groupid 并检查我的记录中的 StopDate 是否大于或等于现在的日期/时间戳。

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

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

奇迹般有效....

于 2010-12-31T02:54:30.437 回答
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();'
于 2012-12-21T10:09:29.143 回答
0

.Date 不起作用,但.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();
于 2012-02-24T22:06:42.503 回答