我正在使用Linq来实体框架来查询一些信息。我试图使用entityfunction.truncatetime,它似乎没有按预期工作。这是我的示例查询
From d In Request
Where d.Requestor= "XXXX" And d.ProcessedFlag = "N"
Select d.RequestID, RequestReason = d.RequestReason.ItemValue, RequestType = d.RequestType.ItemValue, RequestedDate = EntityFunctions.TruncateTime(d.RequestedMoveDate)
请求的日期似乎没有截断时间部分,我仍然得到日期和时间。
我在这里错过了什么吗?
答案 0 :(得分:4)
在.NET中,DateTime类实际上表示日期和时间。在内部,它被存储为数字值,表示自公元1001年1月1日午夜以来100纳秒“滴答”的数量。此数字在显示时(在输出中或在调试器中)被“转换”。此转换通过格式字符串完成。
即使你截断一个DateTime的时间部分,它仍然有一个时间......它只是00:00:00,如果你不想看到那个时间,你需要调整你的格式字符串不转换这一点。
因此,如果您执行以下操作:DateTime.Now.Date
如果您使用默认日期转换字符串(或者您文化的默认格式),它将显示“10/15/2012 00:00:00” )。
如果您只想显示日期部分,则必须执行myDate.ToShortDateString()
或myDate.ToString("d")
之类的操作。
EntityFunctions是一组设计用于Linq to Entities查询的工具,因为在查询中通常不允许执行DateTime格式化。
例如,此代码不起作用:
var q = from x in dc where x.BirthDate == DateTime.Now.AddYears(-15).Date select x;
你必须这样做:
var q = from x in dc
where x.Birthdate == EntityFunctions.TruncateTime(DateTime.Now.AddYears(-15))
select x;
然后,这将生成正确的SQL以在SQL代码中进行日期比较。这就是EntityFunctions的设计目的,而不是截断选择部分中的日期(尽管它确实有效)。但是,即使日期被截断,它仍然会有一个Time组件,它只是00:00:00,你必须使用日期格式字符串以你想要的方式将它呈现给你的用户。
答案 1 :(得分:0)
你不能像下面那样使用ToShortDateString()吗?
List<DateTime> time = new List<DateTime>();
time.Add(DateTime.Now);
var WhatDate = from date in time
select new { Date = date.ToShortDateString() };
在你的情况下试试这个
From d In Request
Where d.Requestor= "XXXX" And d.ProcessedFlag = "N"
Select new{ RequestID = d.RequestID, RequestReason = d.RequestReason.ItemValue, RequestType = d.RequestType.ItemValue, RequestedDate = d.RequestedMoveDate.ToShortDateString()};