2014-01-10 542 views
1

在表中,DueDate數據類型爲varchar。現在,我要檢查的截止日期與今天的日期在LINQ Query中,將字符串轉換爲datetime並檢查今天的日期

var query = (from o in db.Order_Reports 
       where Convert.ToDateTime(o.ReportDueDateTime) >= DateTime.Now 
       select o); 

錯誤

LINQ到實體無法識別方法「的System.DateTime ToDateTime(System.String)」的方法,而這種方法無法翻譯成商店表達。

我怎麼想的字符串轉換爲日期和時間,並與今天的日期檢查

+0

可能重複的[LINQ查詢以將字符串轉換爲日期時間(http://stackoverflow.com/questions/21038960/linq-query-to-convert-string-to-datetime) – wudzik

+0

它不會按照你的描述工作......但是,可能有一種解決方法。 ReportDueDateTime列的確切格式是什麼?是YYYYMMDD嗎? – DarkWanderer

+0

你爲什麼又問這個問題?有沒有你不喜歡你接受的答案?爲什麼'DueDate'是一個'varchar'肯定是這個問題需要解決呢? – Colin

回答

1

我不知道的方式要實現它,你描述它,因爲

  1. 有沒有在SQL沒有的功能,將不平等過濾字符串格式的日期(至少是那些與你的日期格式工作,是可轉換的LINQ to SQL查詢)。
  2. 你在你的數據庫設計中的缺陷,防止從工作

但是「正常」的方法,也有一些可能的解決方法

  1. 修改數據庫以便日期是實際的日期時間格式(最好的選擇,但當然有時不可用)
  2. 創建存儲過程以實現相同的目標。在SQL代碼,你可以使用日期解析
  3. 修改查詢,如下所示:

(代碼)

// Our required date 
DateTime reportDate = new DateTime(2014,1,1).Date; 
// Let's find number of days between now and required day. Ensure that the date is not in the future! 
int deltaDays = (DateTime.Now.Date - date).Days; 
// Let's get the list of dates which we need the reports for 
var dates = Enumerable.Range(0, deltaDays + 1).Select(dd => DateTime.Now.Date.AddDays(-dd).ToString("MM/dd/yyyy")).ToArray(); 
// and query by this list 
var query = (from o in db.Order_Reports 
      where o.ReportDueDateTime in dates 
      select o); 

這將是一個有點低效,但達到目的不改變DB 。將其視爲臨時解決方案。

0

嘗試DateTime.Parse(o.ReportDueDateTime),並看看是否能工程

+0

不工作的錯誤 - LINQ to Entities無法識別方法System.DateTime Parse(System.String)方法,並且此方法不能被翻譯成商店表達。 – Golda

+0

在Linq查詢之外的情況下,聲明一個字符串變量並將其設置爲DateTime.Now.ToString(),然後在Linq查詢中執行一個字符串比較,一個哈希位,但它應該工作。但是,如果可能的話,您應該查看將數據庫列更改爲DateTime。 –

+0

@StevenWood:不行,他需要> =,不只是= – DarkWanderer

-1

也許這將工作

// Make new variable in DateTime Format 
DateTime dateFrom = DateTime.ParseExact(o.ReportDueDateTime, "MM/dd/yyyy", CultureInfo.InvariantCulture); 

var query = (from o in db.Order_Reports 
       where dateFrom >= DateTime.Now 
       select o); 
+0

'o.ReportDueDateTime'不能在LINQ語句之外被引用。 – Flater

+0

我的錯,對不起。我使用動態LINQ庫進行類似的任務。 – Tomcat

0

的問題是,LINQ到實體不能夠轉Convert.ToDateTime爲有效的SQL。如果你把所有記錄到內存到AsEnumerable()ToList()打電話,那麼你將使用LINQ到SQL,並且將與C#職能的工作:

var query = (from o in db.Order_Reports.AsEnumerable() 
       where DateTime.ParseExact(o.ReportDueDateTime, 
             "MM/dd/yyyy", 
             "M/d/yyyy") >= DateTime.Now 
       select o); 

但問題是,你可能會帶來記錄太多記錄。但是,如果您有足夠的報告是令人擔憂的,那麼您應該將該數據庫索引放在該數據庫索引上,並且您需要該索引按日期順序排列。因此,請將該列更改爲DateTime或將數據更改爲可按字母順序排序的格式 - 例如「YYYY-MM-DD-HH-mm」。然後,你可以這樣做:在LINQ到實體 這種情況下happend

var query = (from o in db.Order_Reports 
      where String.Compare(ReportDueDateTime, 
            DateTime.Now.ToString("YYYY-MM-DD-HH-mm")) >= 0 
       select o); 
+0

它顯示錯誤像運算符'>'不能應用於類型'字符串'和'字符串'的操作數 – Golda

+1

嘗試'String.Compare(o.ReportDueDateTime,DateTime.Now .ToString(「YYYY-MM-DD-HH-毫米「)> = 0'而不是 –

+0

不知道你嘗試過哪一個,但只是意識到'Convert.ToDateTime可能不工作,如果文化不匹配。編輯使用'ParseExact – Colin

0

是這個問題時經常DateTime的不同之處在於它是nullable

的LINQ可以理解Convert.ToDateTimeGetValueOrDefault()

但Entitie沒有運動

你的手杖使用Date.Value
此代碼:

var x = myContext.MyTable.Where(tbl => tbl .MyDateColumn.Value == DateTime.Now) 
0

您可以使用String.Compare。

var query = from o in db.Order_Reports 
      where String.Compare(o.ReportDueDateTime, Now.ToString()) > 0 
      select o; 
相關問題