2

私はLinqを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 日午前 0 時からの 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 が設計されているものです (ただし、機能します)。ただし、日付は切り捨てられますが、時刻コンポーネントは残り、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 に答える