2011-08-16 25 views
47

我想執行以下代碼,並收到一條錯誤「日期」在LINQ to Entities中不受支持。只有初始化,實體成員和實體導航屬性都支持

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    var context = new LoggingEntities(); 
    var query = from t in context.Logs 

      where t.Title == title 
      && t.Timestamp == LogDate 

      select t; 
    return query.ToList(); 
} 

我收到錯誤是「指定類型的成員‘日期’是不支持LINQ to Entities,只支持初始化器,實體成員和實體導航屬性。「我已經嘗試過將everythign投射到一個字符串的各種嘗試,只是比較日期部分,但似乎無法得到正確的組合。任何幫助是極大的讚賞。

+1

使用我們展示日誌類和它的映射表。 – BennyM

+0

我使用.net 3.5的EFv1。 日誌類只是企業庫中的一個日誌表,標題爲字符串類型,時間戳爲日期時間字段。我只想比較日期部分 – mikemurf22

回答

23

不是最好的解決方案,但它的工作原理。由於各種原因,我必須在此時使用.net 3.5,並且修改數據庫將很困難。無論如何,這裏是一個解決方案:

  var query = from t in context.Logs 
         where t.Title == title 
         && t.Timestamp.Day == LogDate.Day 
         && t.Timestamp.Month == LogDate.Month 
         && t.Timestamp.Year == LogDate.Year 
         select t; 

不是最優雅的解決方案,但它是有效的。

+0

LINQ to Entities不支持指定的類型成員'Date'。僅支持初始化程序,實體成員和實體導航屬性。 – SAR

1

糾正我,如果我錯了,但在mikemurf22的例子中,它需要檢查日期組件的每個部分,並可能更多的服務器處理?

無論如何,我偶然發現了這個問題,這是我的解決方案。

假設您將只傳入日期組件,您可以找到您傳入的一天中的最後一分鐘,然後使用where子句來定義範圍。

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59) 

    var query = from t in context.Logs 
       where t.Timestamp >= date 
       where t.Timestamp <= enddate 
       select t; 

    return query.ToList(); 
} 
-1

您可以使用此技巧:

DateTime startDate = LogDate.Date; 
DateTime endDate = LogDate.Date.AddDays(1); 

var query = from t in context.Logs 
      where t.Title == title 
        && t.Timestamp >= startDate 
        && t.Timestamp < endDate 
      select t; 
+0

我改正了一點。你的查詢中不能使用AddDays方法。但是你可以將它移到外面。所以解決方法仍然有效。 – algreat

83

如果您正在使用EF 6.0 +,你可以使用DbFunctions.TruncateTime(DateTime?)

var query = 
    from t in context.Logs 
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date 
    select t; 

注:EF其中的早期版本DbFunctions不可用,可以用EntityFunctions.TruncateTime(DateTime?)代替。

+0

您還必須截斷LogDate.Date屬性 – invalidusername

+1

@invalidusername LogDate是一個DateTime,這意味着LogDate.Date被截斷爲 –

+3

+1。在我的案例中,我無法使用接受的答案,因爲我做了一次「大於」比較,其中您無法單獨比較日,月和年。 –

2

對於xDateTimeStart和LogDate都始終使用EntityFunctions.TruncateTime()。 如:

var query = from t in context.Logs 
       where t.Title == title 
       && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate) 
       select t; 
0

轉換的longdate到.ToShortDateString然後就可以使用這種方式:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate 

像邁克

0

試試這個:

var calDate = DateTime.Now.Date.AddDays(-90); 

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate) 
相關問題