2016-07-14 42 views
1

x.CreateDateDateTimeは、ミリ秒単位でデータベースに格納されます。私のdateTimePickerの値startdateとenddateは、秒までのクエリを許可します。LINQ DateTimeミリ秒を無視するクエリ

x.CreateDateのミリ秒を無視するようにクエリを変更するにはどうすればよいですか?私は以下に書いたコードはうまくいくと思ったが、そうではない。

if (stardDateIsValid && endDateIsValid && startdate == enddate) 
    query = _context.Logs 
     .Where(x => x.ApplicationID == applicationId && 
        x.CreateDate.AddMilliseconds(-x.CreateDate.Millisecond) == startdate) 
     .OrderByDescending(x => x.ID) 
     .Take(count); 
+0

、あなたはそれが動作しませんどのような方法で私たちを教えてください。 – DavidG

+0

ありがとうございます。結果は返されません – user2415620

+0

'startdate'はどの形式ですか? –

答えて

0

テーマのいくつかのバリエーションを試してみたので、上記の質問から何の結果も得られなかったのか分かりません。しかし、私はそれが正常に動作するように開始し、ミリ秒を追加することによって、開始日と終了日の変数とそれは働いています。

if (stardDateIsValid && endDateIsValid) 
    startdate = startdate.AddMilliseconds(000); 
    enddate = enddate.AddMilliseconds(999); 
    query = _context.Logs.Where(x => x.ApplicationID == applicationId && x.CreateDate >= startdate && x.CreateDate <= enddate).OrderByDescending(x => x.ID).Take(count); 
+1

'startdate = startdate.AddMilliseconds(000);は何もせず、削除することができます。 'enddate = enddate.AddMilliseconds(999);'は 'enddate = enddate.AddSeconds(1);'と 'x.CreateDate

+0

Jamesに感謝します。 – user2415620

1

同じ形式でCreateDatestartdateを取得するあなたはリンゴにリンゴを比較するのに役立ちます。これはそれを達成するはずです。

if (stardDateIsValid && endDateIsValid && startdate == enddate) 
    query = _context.Logs 
     .Where(x => x.ApplicationID == applicationId && 
        x.CreateDate.ToString(@"MM/DD/YYYY h:mm:ss") == startdate.ToString(@"MM/DD/YYYY h:mm:ss") 
     .OrderByDescending(x => x.ID) 
     .Take(count); 
+0

ありがとうございます。 [メッセージ] AS [メッセージ] AS [エクステント1]。[ID] AS [ID]、 [エクステント1]。[メッセージ] AS [メッセージ] AS [メッセージID] [エクステント1]。[アプリケーションID] AS [アプリケーションID]、 [エクステント1 [データ] AS [ログ] AS [エクステント1]} ベース:{SELECT [エクステント1]。[ID] AS [CreateDate] AS [CreateDate] [Extent1]。[ApplicationID] AS [ApplicationID]、 [Extent1]。[CreateDate] AS [CreateDate]、 [Extent1]。[データ] [メッセージID] [エクステント1]。[メッセージ] AS [メッセージ] [ ] AS [データ] FROM [dbo]。[ログ] AS [エクステント1]} ローカル:カウント= 0 – user2415620

+1

x.CreateDate.ToSt (@ "MM/DD/YYYY h:mm:ss")== startdate.ToString(@ "MM/DD/YYYY h:mm:ss") –

+1

@CiroCorvino良いアイデア!私は –

1
var query = from l in _context.Logs 
      where l.ApplicationID == applicationId 
      && SqlMethods.DateDiffSecond(l.CreateDate,startdate) == 0 
      orderby l.ID descending 
      select l).Take(count); 

これは、日付のように2つの日付を比較することで、文字列とそれに続く文字列の比較に使用するテーブル内のすべての日付を変換避けることができます。

+0

を更新しますが、l.CreateDateの値にはミリ秒が含まれており、startdateには含まれていないため、正しく理解すれば何も返さないでしょうか? Sqlmethodsのアセンブリ参照を追加して試しました。エラーはありませんが、結果は返されません。 – user2415620

+1

@ user2415620「DateDiffSecond」は差を秒単位でしか比較しません。 (Northwind dbを使ってテストし、真夜中から0.5秒の開始時間) –

0

拡張メソッドを作成できます。

public const long TicksPerMillisecond = 10000; 
public const long TicksPerSecond = TicksPerMillisecond * 1000; 

public static bool IsEqualIgnoreMilliseconds(this DateTime date, DateTime compareDate) 
{ 
    long tickDiff = date.Ticks - compareDate.Ticks; 
    return tickDiff > 0 ? tickDiff < TicksPerSecond : tickDiff < -TicksPerSecond; 
} 

次に、あなたがこれを使用することができます:あなたは「それは働いていない」と言うとき

if (stardDateIsValid && endDateIsValid && startdate == enddate) 
    query = _context.Logs 
    .Where(x => x.ApplicationID == applicationId && 
       x.CreateDate.IsEqualIgnoreMilliseconds(startdate) 
    .OrderByDescending(x => x.ID) 
    .Take(count); 
関連する問題