2016-06-29 64 views
-1

我想將一個日期轉換爲一個字符串,所以我可以搜索輸入的值。我正在使用lamda表達式和DateTime.ParseExact,因爲我只想使用輸入的短日期。如何使用實體框架按日期搜索?

這是我與數據庫的連接:

var devices = db.Devices 
      .Include(d => d.DeviceType) 
      .Include(d => d.ManufacturerModel) 
      .Include(d => d.ManufacturerModel.Manufacturer); 

和我的搜索

if (!String.IsNullOrEmpty(searchString5)) 
{ 
    devices = devices.Where(s => DateTime.ParseExact(s.DateReceived,'dd/MM/yyyy'); 
} 
+0

你面臨的問題是什麼? – AlwaysAProgrammer

+0

'Where'需要一個_predicate_,它需要返回一個布爾值。你的意思是比較返回的數據,或者你只是想要解析成功的項目? –

+1

如果你想將日期轉換爲字符串,你爲什麼要解析任何東西?只要用你的格式調用'ToString',當然?目前還不清楚你實際想要在這裏做什麼。 –

回答

1

你不能輕鬆地比較兩個日期,因爲你仍然需要比較小時,分鐘和秒。

相反,您要讓用戶選擇範圍 - 從日期和日期。

例如,

var query = db.Devices 
      .Include(d => d.DeviceType) 
      .Include(d => d.ManufacturerModel) 
      .Include(d => d.ManufacturerModel.Manufacturer); 

string fromDate = "1/15/2016", toDate = "1/30/2016"; 
    DateTime fromDateTime, toDateTime; 

if(!DateTime.TryParse(fromDate, out fromDateTime)) 
{ 
    // Make fromDateTime to Start of Day - 1/15/2016 12:00:00 AM 
    fromDateTime = fromDateTime.Date; 
    query = query.Where(x => x.Date >= fromDateTime); 
} 

if (!DateTime.TryParse(toDate, out toDateTime)) 
{ 
    // Make toDateTime to End of day - 1/30/2016 11:59:59 PM 
    toDateTime = toDateTime.Date.AddDays(1).AddTicks(-1); 
    query = query.Where(x => x.Date <= toDateTime); 
} 

var result = query.ToList(); 
0

不要使用字符串。讓框架爲你付出沉重的代價。

DateTime dt; 
if (DateTime.TryParse(searchString5, out dt)) { 
    qry = qry.Where(s => s.Fecha.Date == dt.Date); 
} else { 
    throw new Exception("Bad input"); 
} 

生成的SQL(在我的情況下)如下,這是相當不錯的。

-- Region Parameters 
DECLARE @p0 DateTime = '2016-03-19 00:00:00.000' 
-- EndRegion 
SELECT 
    ... 
FROM 
    ... 
WHERE CONVERT(DATE, [t0].[Fecha]) = @p0 

以下是一條建議:使用LINQPad來編寫和分析您的查詢。它是免費的(付費版本很便宜,但它很荒謬有力且有用)。