2

我正在使用 Linq to entityframework 来查询一些信息。我正在尝试使用 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)

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

我在这里错过了什么吗?

4

2 回答 2

4

在 .NET 中,DateTime 类实际上表示日期和时间。在内部,它存储为一个数值,由自公元 1001 年 1 月 1 日午夜以来的 100 纳秒“滴答”数表示。此数字在显示时(在输出中或在调试器中)得到“转换”。此转换是通过格式字符串完成的。

即使您截断了 DateTime 的时间部分,它仍然有时间......它只是 00:00:00,如果您不想看到那个时间,则需要调整格式字符串以不转换它。

因此,如果您执行以下操作: DateTime.Now.Date如果您使用默认日期转换字符串(或您的文化的默认格式),它将显示“10/15/2012 00:00:00”。

如果您只想显示 Date 部分,那么您必须执行类似myDate.ToShortDateString()or的操作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 的设计目的,而不是在选择部分截断日期(尽管它确实有效)。但是,即使日期被截断,它仍然会有一个时间组件,它只是 00:00:00,并且您必须使用日期格式字符串以您想要的方式将其呈现给您的用户。

于 2012-10-15T21:43:26.933 回答
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()};
于 2012-10-15T18:25:06.067 回答