2017-09-29 28 views
0

爲什麼底層linq實體可以工作,但註釋掉的頂層查詢不起作用?此函數只能從Linq調用實體框架中的實體

var yogaProfile = dbContext.YogaProfiles.Where(i => i.ApplicationUserId == userId).First(); 
var yogaSpace = yogaProfile.YogaSpaces.Where(j => j.YogaSpaceId == yogaSpaceId).First(); 

if (yogaSpace == null) 
throw new Exception("You Don't Have A Yoga Space With This ID!"); 

var todayPlus30 = DateTime.Now.AddDays(30); 
var yesterday = DateTime.Now.Date.AddDays(-1); 

// Does not work!! 
//var yogaEvents = yogaSpace.YogaSpaceEvents.Where(k => 
// DbFunctions.TruncateTime(k.EventDateTime) > DbFunctions.TruncateTime(yesterday) && 
// DbFunctions.TruncateTime(k.EventDateTime) < DbFunctions.TruncateTime(todayPlus30)).ToList(); 


var yogaEvents = yogaSpace.YogaSpaceEvents.Where(k => 
k.EventDateTime.Date > yesterday && 
k.EventDateTime.Date < todayPlus30); 
+1

不向我們展示什麼DbFunctions.TruncateTime(...)確實很難回答,因爲它顯然是唯一的區別。 TruncateTime中的某些內容正在使用數據庫端方法不支持的方法。 –

+0

'DbFunctions.etc(..'不是Linq函數,所以它不起作用 – Irfan

回答

1

問題是您沒有在正確的上下文中使用DbFunctions。這些可以在Linq-To-Entities中使用,但是您已經使用實體框架獲取了yogaSpace對象。

現在您正試圖從另一個IEnumerable類型的數據獲取數據 YogaSpaceEvents因此它不會與Linq-To-Object上下文一起使用。

在這種情況下,你可以使用標準的日期從操作的問題,克服..

見參考文獻:
Linq Exception: Function can only be invoked from linq to entities
linq exception : This function can only be invoked from LINQ to Entities
EF extension method: "This function can only be invoked from LINQ to Entities."