如何在 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 查询中执行日期比较?的主要内容,如果未能解决你的问题,请参考以下文章
从firestore查询数据时,如何将保存的字符串格式的日期与当前日期进行比较?