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

Posted

技术标签:

【中文标题】如何在 EF 查询中执行日期比较?【英文标题】:How do I perform Date Comparison in EF query? 【发布时间】:2010-11-08 11:04:49 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

正在为此苦苦挣扎,决定使用扩展方法,只是稍后才能找到有关此的信息-.- 这应该是答案 EntityFunctions 已过时,由 DbFunctions 取代,更新答案以反映这一点 EntityFunctions 在 EF 6.0 中被替换。因此,如果您仍在使用 4.5 或更早版本(如我自己),您仍应使用 EntityFunctions。 您是如何看到生成 DbFunctions.TruncateTime 的 sql 查询的:((convert (datetime2, convert(varchar(255), [Extent1].[InspectionReportInfo_Date], 102), 102)) = '2015 -02-10T00:00:00' 这会杀死任何索引,我会避免它...social.msdn.microsoft.com/Forums/en-US/…【参考方案2】:

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

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

在我的代码中。

【讨论】:

这有效:WHERE StartDateColumn 这不是问题 - e.AsofDate.Date 是问题(仅比较日期部分 - 双方...【参考方案3】:

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

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

【讨论】:

“.Value”是我的顿悟。【参考方案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) 和明天 (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】:

试试这个:

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】:

我很好奇当您传递'DateTime' 时出现'Date' 的错误消息。难道'StartDateColumn'实际上是'Date',而不是数据库中的'DateTime'?这可能会打乱比较...

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我正在使用 LinqDataSource,但在获取包含日期比较的查询时遇到问题,无法正确执行。答案是使用 WhereAddParameters 函数并将测试值添加为强类型参数。

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

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

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

像魅力一样工作......

【讨论】:

【参考方案10】:

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

【讨论】:

这可能不是你想要的。它只会得到当月的一天。因此,例如,1 月 1 日和 2 月 1 日都有相同的“日”分量值,尽管实际上是不同的实时日期。【参考方案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();'

【讨论】:

以上是关于如何在 EF 查询中执行日期比较?的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize如何在查询中比较日期的年份

从firestore查询数据时,如何将保存的字符串格式的日期与当前日期进行比较?

按日期部分比较实体框架中的SQL日期时间

使用 EF 核心 3 将字符串与日期进行比较

向“datetime2”列添加值导致溢出。 EF Core 日期比较

Mysql - 如何将字符串中的日期与查询中的unix时间进行比较