2011-05-10 25 views
8

要選擇所有Scheduling S的是活動的,我有以下代碼:實體框架 - 聯合導致「無法創建類型的恆定值。」

var allSchedulesOnALine = CurrentUser.Lines.SelectMany(o => o.Scheduling).Where(o => o.Active); 
var allSchedulesUnscheduled = Entities.SchedulingSet 
    .Where(o => o.Line == null && o.Site.Id == CurrentUser.Site.Id && 
      o.Factory == CurrentUser.Factory && o.Active); 

IEnumerable<Scheduling> allSchedules = allSchedulesUnscheduled.Union(allSchedulesOnALine); 
foreach(Scheduling schedule in allSchedules.OrderBy(o => o.Ordering)) 
{ 
    //Do Stuff 
} 

Factoryint

當我運行這段代碼,我上foreach行這神祕的錯誤:

無法創建一個類型爲'System.Collections.Generic.IEnumerable`1的常量值。在此上下文中僅支持基本類型(如Int32,String和Guid)。

奇怪的是,我可以單獨列舉allSchedulesOnALineallSchedulesUnscheduled。即使陌生人,如果我重新訂購聯盟:

IEnumerable<Scheduling> allSchedules = allSchedulesOnALine.Union(allSchedulesUnscheduled); 

它工作正常!

有沒有人知道爲什麼會發生這種情況?我錯過了一些至關重要的東西,還是這是一個錯誤?

我應該提到我正在使用Entity Framework 3.5。 EF4目前不是我們的選擇 - 它超出了我的控制範圍:\

+0

我相信這個錯誤信息表明EF不能將你的union語句翻譯成SQL,但我不知道爲什麼。是否有可能'CurrentUser.Lines.SelectMany(o => o.Scheduling).Where(o => o.Active)'沒有使用延遲執行?在這種情況下,它可能會解釋爲什麼你可以使用它來定向一個方向,而不是另一個方向 - 一個在內存中運行,另一個則試圖在SQL中完全運行。思考? – Pandincus 2011-05-10 22:42:48

回答

12

您正在調用兩種不同的方法來處理「重新排序」。

你沒有表現的類型allSchedulesOnALineallSchedulesUnscheduled,但我打賭allSchedulesOnALineIEnumerable<Schedule>型和allSchedulesUnscheduledIQueryable<Schedule>類型。

因此,當您調用Queryable.Union時,您要求EF將表達式轉換爲SQL。但您傳遞的參數的類型爲IEnumerable<Schedule>,並且無法將其轉換爲查詢。

另一方面,當你打電話給Enumerable.Union時,你會問LINQ to Objects在內存中執行整個操作,雖然運行速度可能會比較慢,但它工作正常。

所以行爲不同的原因是你調用了兩個完全不同的方法,它們做了不同的事情,但碰巧有相同的名字。不,這不是一個錯誤。

+0

這一定是你在這裏幫助我解決EF問題的十幾次,包括我認爲的這個確切的問題(呃)。再次感謝,克雷格! – 2011-05-18 05:43:10

相關問題