2010-03-31 63 views
3

如果給定一個DateTime作爲字符串的實體,我有哪些選項可以在日期時使用LINQ to Entities過濾數據?Linq to Entities日期時間轉換

它似乎不支持我做DateTime轉換。

基本上,我要完成:

var filtered = from item in entities.itemsSet 
       where Convert.ToDateTime(shift.starttime) >= startDate 
        && Convert.ToDateTime(shift.endtime) < endDate 
       select item; 

有哪些選擇來做到這一點?

+0

你有什麼樣的錯誤,如果有的話? – BlackICE 2010-03-31 19:41:27

+0

基本上沿着「Linq實體不支持(Convert.ToDateTime(String))...」 – 2010-03-31 19:48:55

回答

3

你將最終做內存過濾。

//So first select your data 

var data= (from item in entities.itemsSet).ToList(); 


//Then filter 
var filtered = from item in data 
      where Convert.ToDateTime(shift.starttime) >= startDate 
       && Convert.ToDateTime(shift.endtime) < endDate 
      select item; 

另一種選擇是創建一個存儲過程來爲你做。在SP中,您必須先開始/結束,然後將其與日期時間字符串作爲日期時間進行比較。

+1

我喜歡這個。雖然縮放可能存在問題,但這會起作用。 SP方式可能是要走的路。 – 2010-03-31 20:17:29

+0

完全同意,但第一場戰鬥是將數據庫類型更改爲日期時間! – Nix 2010-03-31 20:29:24

+0

就像上面的代碼可以被簡化爲一個查詢一樣...... by just doing var filtered =(從entities.itemsSet中選擇項目。AsEnumarable() – Nix 2010-03-31 20:30:38

1

我有同樣的問題,因爲EF當前的Sql Server數據提供程序忽略將DateTime.Parse轉換爲CAST(varField As DateTime)。

所以要建立一個表達式樹,其可以順利地轉化爲商店的表情,我施加的行爲與人們從謂語遇到下列情況:DateTime.Parse(x.DateField)== DateConstraint

注意,「客戶」對象包含輸入參數以產生一謂詞用於在使用中:EFQuery.Where(謂詞)

if (client.DateOfBirth.HasValue) // can't find a string <-> DateTime conversion syntax with EF support 

     { 

      var day = client.DateOfBirth.Value.Day.ToString().PadLeft(2, '0'); 

      var month = client.DateOfBirth.Value.Month.ToString().PadLeft(2, '0'); 

      var year = client.DateOfBirth.Value.Year.ToString(); 

      // very verbose, but apparently there's no EF support for String to DateTime conversion 

      spec = spec.And(c => SqlFunctions.IsDate(c.DateOfBirth).HasValue && SqlFunctions.IsDate(c.DateOfBirth).Value == 1 

       && c.DateOfBirth.StartsWith(day) 

       && month == (c.DateOfBirth.Contains("-") || c.DateOfBirth.Contains("/") 

       ? c.DateOfBirth.Substring(c.DateOfBirth.Contains("-") ? c.DateOfBirth.IndexOf("-") + 1 : c.DateOfBirth.Contains("/") 

       ? c.DateOfBirth.IndexOf("/") + 1 : 0, 2) : "f") 

       && c.DateOfBirth.EndsWith(year)); 

     } 

正如可以看到,在上述執行字符串的日,月相匹配,和年份的組成部分,並預計將有DD/MM/YYYY代表(Aussie Aussie Aussie!)。它可以很容易地修改爲使用不同的日期表示和/或包括Time組件的約束。

6

使用System.Data.Objects.SqlClient.SqlFunctions

有一個名爲DateDiff函數具有重載接受字符串作爲日期。

SqlFunctions類中的所有函數都編譯成SQL語句,並且只能在Linq內部用於實體。

[EdmFunctionAttribute("SqlServer", "DATEDIFF")] 
public static Nullable<int> DateDiff(string datePartArg, string startDate, string endDate) 

http://msdn.microsoft.com/en-us/library/dd466158.aspx

您將需要像「天」爲指定要比較的日期部分的第一個參數字符串傳遞。該功能直接映射到SQL函數DATEFIFF:

http://msdn.microsoft.com/en-us/library/ms189794.aspx

有LINQ的類似的類SQL,只是警告你。

+0

Neato!這在使用linq-to-entities查詢存儲在varchar列中的日期的日期比較時保存了我的培根。 – anewcomer 2012-08-03 02:10:18