EntityFunction.TruncateTime在我的查询中不起作用

时间:2012-10-15 18:03:06

标签: asp.net linq entity-framework entity

我正在使用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)

请求的日期似乎没有截断时间部分,我仍然得到日期和时间。

我在这里错过了什么吗?

2 个答案:

答案 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()};