2016-07-14 110 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

我不知道爲什麼我無法從上面發佈的查詢中得到任何結果,因爲我嘗試了幾種主題變體。但是,我確實通過向startdate和enddate變量添加毫秒來正常工作,並且它正在工作。

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

謝謝,但它仍然沒有結果。代碼_context.Logs {SELECT [Extent1]。[ID] AS [ID], [Extent1]。[Message] AS [Message], [Extent1]。[ApplicationID] AS [ApplicationID], [Extent1 ] [CreateDate] AS [CreateDate], [Extent1]。[Data] AS [Data] FROM [dbo]。[Log] AS [Extent1]} base:{SELECT [Extent1]。[ID] AS [ID], [Extent1]。[Message] AS [Message], [Extent1]。[ApplicationID] AS [ApplicationID], [Extent1]。[CreateDate] AS [CreateDate], [Extent1]。[Data ] AS [Data] FROM [dbo]。[Log] AS [Extent1]} Local:Count = 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); 

這避免了每個日期轉換在你的表成一個字符串並隨後字符串比較,通過比較兩個日期的日期。

+0

感謝詹姆斯,但因爲l.CreateDate值包含毫秒,startdate不會,如果我理解正確,它將永遠不會返回任何內容?我已經添加了Sqlmethods的程序集引用並試了一下。沒有錯誤但不會返回任何結果。 – user2415620

+1

@ user2415620'DateDiffSecond'只比較幾秒內的差異。 (我使用Northwind db對其進行了測試,並且在午夜之後半秒的開始時間) –

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);