2015-12-09 20 views
1

我有一個非常簡單的情況,但我無法找到網絡上任何地方的答案。實體框架/ LINQ - 日期從/日期比較

我想實現一個簡單的搜索它允許用戶查詢具有起始日期和之間的時間戳由用戶選擇日期數據庫記錄。用戶也可以通過稱爲樣本號的文本字段的子字符串來過濾結果。

查詢的工作原理如果我只做一個子字符串搜索並放棄比較where子句的日期的能力。 只要在where子句中比較日期,查詢就不會返回任何結果。

下面是不同的測試結果進行:

對於落在範圍,並在所有不產生結果時(應該有一些由右)日期此查詢搜索,因此這並不工作:

public List<devicereading> getDeviceReadings(String entityConnStr, DateTime fromDate, DateTime toDate, String sampleNo) 
{ 
    labinstrumentconnection lc = new labinstrumentconnection(entityConnStr); 
    List<devicereading> ll = lc.devicereadings.Where(d => d.datetime >= fromDate && d.datetime <= toDate && d.samplenumber.Contains(sampleNo)).ToList(); 
    return ll; 
} 

這一個只在一個單一的日期比較只搜索ie。對於給定日期後的日期只,但它也不會產生任何結果,所以這不起作用:

public List<devicereading> getDeviceReadings(String entityConnStr, DateTime fromDate, DateTime toDate, String sampleNo) 
{ 
    labinstrumentconnection lc = new labinstrumentconnection(entityConnStr); 
    List<devicereading> ll = lc.devicereadings.Where(d => d.datetime >= fromDate).ToList(); 
    return ll; 
} 

這一次只做一個字符串搜索和不沒有日期比較。這個工作!

public List<devicereading> getDeviceReadings(String entityConnStr, DateTime fromDate, DateTime toDate, String sampleNo) 
{ 
    labinstrumentconnection lc = new labinstrumentconnection(entityConnStr); 
    List<devicereading> ll = lc.devicereadings.Where(d => d.samplenumber.Contains(sampleNo)).ToList(); 
    return ll; 
} 

我看不出有什麼問題了。希望有人在那裏可以看到問題出在哪裏。

非常感謝。

+0

當您運行最後一個(**無日期比較**)查詢時,是否可以打開結果列表並查看它是否包含日期落入該範圍的項目?你還只是存儲日期還是你還有時間部分? –

+0

我沒有看到任何問題與查詢。您可能需要檢查您是否確實有數據落在該範圍內。嘗試更廣泛的日期範圍。 – Yoky

+0

如果您監視SQL查詢,您會看到什麼?在SSMS中運行時,這些查詢是否返回結果? –

回答

0

您應該使用DbFunction.TruncateTimeSystem.Data.Entity命名空間來比較日期而不必擔心時間。

public List<devicereading> getDeviceReadings(String entityConnStr, DateTime fromDate, DateTime toDate, String sampleNo) 
{ 
    labinstrumentconnection lc = new labinstrumentconnection(entityConnStr); 
    var fromDateWithoutTime = fromDate.Date 
    List<devicereading> ll = lc.devicereadings.Where(d => DbFunction.TruncateTime(d.datetime) >= fromDateWithoutTime).ToList(); 
    return ll; 
} 

public List<devicereading> getDeviceReadings(String entityConnStr, DateTime fromDate, DateTime toDate, String sampleNo) 
{ 
    labinstrumentconnection lc = new labinstrumentconnection(entityConnStr); 
    var toDateWithoutTime = toDate.Date 
    var fromDateWithoutTime = fromDate.Date 
    List<devicereading> ll = lc.devicereadings.Where(d => DbFunction.TruncateTime(d.datetime) >= fromDateWithoutTime && DbFunction.TruncateTime(d.datetime) <= toDateWithoutTime && d.samplenumber.Contains(sampleNo)).ToList(); 
    return ll; 
} 
+0

如果您查看日期範圍,時間組件並不重要。 –

+0

@GertArnold它確實是 –

+0

非常感謝AlbertoMonteiro。您的解決方案效果非常好。欣賞你重寫代碼的時間。 只是一個留在EF6名稱空間困惑(像我一樣)的筆記,這裏是代碼爲EF6 var fromDateWithoutTime = fromDate.Date; var toDateWithoutTime = toDate.Date; List ll = lc.devicereadings.Where(d => System.Data.Objects.EntityFunctions.TruncateTime(d.datetime)> = fromDate && System.Data.Objects.EntityFunctions.TruncateTime(d.datetime)< = toDate && d.samplenumber.Contains(sampleNo))。ToList(); – Flameater