2012-07-02 53 views
1

我有一個ValidDate領域的數據庫 - 這是一個字符串(我們犯了一個錯誤,它應該是一個日期,但我們現在不能修改數據庫。)如何比較LINQ中的字符串列(如DateTime)?

,現在我想比較這提交給美國一個參數(validDateStart)從網站:

priceList = priceList.Where(p => Convert.ToDateTime(p.ValidDate) >= Convert.ToDateTime(validDateStart)); 
var list = initPriceList.ToList(); 

但我得到一個錯誤:方法ToDateTime沒有實現。

有人可以給我一些幫助嗎?謝謝!

回答

3

這不支持Linq to Entities(據我所知Linq to SQL)。請記住,您的查詢在數據庫上執行- 其中Convert.ToDateTime根本沒有等價物。

查詢中的任何字符串解析實際上只是一種解決方法 - 作爲真正的解決方案,這些列不是字符串,而是數據庫中的datetime,您首先不會遇到此問題。

哈克解決方法是物化的所有行(你可以使用AsEnumerable()爲),然後做解析 - 這將有不好的表現,雖然,但如果有幾行可能的工作不夠好:

var startDate = DateTime.Parse(validDateStart); 
var list = priceList.AsEnumerable() 
        .Where(p => DateTime.Parse(p.ValidDate) >= startDate); 
        .ToList(); 

編輯:

你的榜樣更新它看起來像你可以做字符串比較做你想要的東西 - 授予它仍然是一個黑客,但將執行比物化的所有行要好得多。這是可能的,因爲你的日期格式首先放置最重要的數字,然後是不重要的部分 - 它是年,然後是月,然後是日(如果情況不是這樣,那麼在你的例子中的月份之前這個解決方案不會工作)。

假設你輸入的字符串validDateStart是在相同的格式,以及你可以這樣做:

var list = priceList.Where(p => p.ValidDate.CompareTo(validDateStart) >=0); 
        .ToList(); 

String.CompareTo字符串比較似乎是支持在Linq to Sql以及Linq to Entities

+0

是的,你是對的,如果我使用AsEnumerable()作爲priceList,那麼它工作的很好。但正如你所說,我有很多記錄,我無法在一個請求中獲得所有記錄,但性能太差。謝謝! – lyon

+1

什麼日期格式是你的字符串列?如果它是ISO8601,你可以通過字符串比較逃脫 - 你有一個例子嗎? – BrokenGlass

+0

與字符串比較?我試過「priceList = priceList.Where(p => p.ValidDate.CompareTo(validDateStart)> 0);」 ,並且仍然得到相同的錯誤:方法CompareTo未實現:( – lyon

0

如果數據庫中的所有記錄始終以年,月和日爲單位(例如:日期格式爲yyyy-MM-dd HH:mm:ss或yyyy/MM/dd或yyyyMMdd)有分隔符或沒有。問題是這些值應該有一個格式,從年,月和日開始。

你可以做到以下幾點:

1:您的過濾器值(網站)轉換爲相同的格式,你在你的數據庫有:

// DateTime format in database: yyyy-MM-dd HH:mm:ss:ffffff 
var from = filtro.CreationDateFrom?.ToString("yyyy-MM-dd"); 
var to = filtro.CreationDateTo?.AddDays(1).ToString("yyyy-MM-dd"); 

2:寫你這樣的查詢(使用CompareTo方法):

var query = (from x in ctx.TskTaskQueues 
      where x.CreationDatetime.CompareTo(from) >= 0 
      && x.CreationDatetime.CompareTo(to) <= 0 
      select x); 

它爲我工作! 我沒有使用LinqToEntities,但我使用的LinqConnect(對於Oracle)與LinqEntities類似。

如果使用像這樣的格式dd-MM-yyyy,它可能不起作用。