2015-08-25 35 views
2

誰能告訴我爲什麼我不能在這樣的實體框架選擇MS SQL數據庫中的新對象:LINQ到SQL內部的.NET Framework數據提供程序錯誤1025

public static Expression<Func<LeaveDay, bool>> IsInDatesRange(DateTime startDate, DateTime endDate){ 
    return ld => ld.StartDate <= endDate && ld.EndDate >= startDate; 
} 


this.ObjectContext.People.Select(p => new NewPeopleObject 
    { 
     Guid = p.Guid, 
     FirstName = p.FirstName, 
     LastName = p.LastName, 
     LeaveDays = p.CalendarData.LeaveDays.AsQueryable() 
     .Where(LeaveDayExpressions.IsInDatesRange(startDate, endDate)) 
     .Select(ld => new LeaveDaySummary 
     { 
      StartDate = ld.StartDate, 
      EndDate = ld.EndDate, 
     }) 
    }) 

沒有AsQueryable()我不能編譯應用程序,因爲LeaveDayExpressions.IsInDatesRange是靜態表達式。我試圖通止Func鍵Where條款,但它拋出內部的.NET Framework數據提供程序錯誤1025使用Expression和AsQueryableLeaveDays我得到這個異常:應該是不可達

人民

代碼是ObjectSet收集與一個CalendarData對象上一個PeopleCalendarDataEntityCollectionLeaveDays

NewPeopleObject是一個幾個屬性類和IEnumarableLeaveDaySummaries集合。

如何在不解析linq to sql錯誤的情況下將表達式傳遞給Where子句?

+1

至於我可以告訴你,不告訴我們如何定義LeaveDayExpressions。如果不能看到這一點,很難提供幫助。 – Hogan

+0

我編輯了我的代碼。 – maniek099

+0

是的,這仍然沒有意義。你想要做一個擴展方法嗎?然後語法應該像'.Where(L => L.IsInDatesRange(startDate,endDate))' – Hogan

回答

3

我無法測試確切的情況下(ObjectContextObjectSet等表明一些老的EF版本),但是我能夠重現最新EF6.1.3上述兩種運行時異常(使用DbContextDbSet)爲好。

讓我們忘掉Func的方法 - EF需要將查詢轉換爲SQL,因此Expression是必須的。而這又需要AsQueryable()。到現在爲止還挺好。

問題是,EF不喜歡錶達式樹中的自定義方法 - 它通常沒有頂級方法的問題,但肯定有嵌套調用的問題,如樣本中(有問題的表達式是外部選擇表達式的一部分)。

我不知道爲什麼,但在大多數情況下(包括本,並在可能的情況),將表達到局部變量查詢的外部和內部使用它解決了問題:

var leaveDayPredicate = LeaveDayExpressions.IsInDatesRange(startDate, endDate); 
var result = this.ObjectContext.People.Select(p => new NewPeopleObject 
{ 
    Guid = p.Guid, 
    FirstName = p.FirstName, 
    LastName = p.LastName, 
    LeaveDays = p.CalendarData.LeaveDays.AsQueryable() 
     .Where(leaveDayPredicate) 
     .Select(ld => new LeaveDaySummary 
     { 
      StartDate = ld.StartDate, 
      EndDate = ld.EndDate, 
     }) 
}); 

對於更高級的方案(如使用來自外部表達的東西表達),你可能需要一些表達處理庫,例如LINQKitInvoke/Expand/AsExpandable自定義擴展方法等

相關問題