2010-12-07 68 views
1

我試圖確定如果我做錯了什麼,或者如果實體框架只是無意這樣做。我想執行一個LINQ樣式查詢來填充一個對象,包括子元素的列表。在Linq2SQL中,這是有效的,並被轉換爲一個高效的SQL查詢,其結果填充新列表。實體框架無法在查詢中使用非實體類嗎?

class ReportItem 
{ 
    string Manager; /* ... */ 
    List<string> Employees; /* ... */ 
} 

var report = (from manager in entities.Managers 
       select new ReportItem() 
       { 
        Manager = manager.Name, 
        Employees = manager.Employees.Select(e => e.Name).ToList() 
       }).ToList(); 

實體框架僱員線會導致method cannot be translated into a store expression錯誤 - 實體框架似乎並不喜歡構建LINQ語句中的非實體類,即使它不涉及任何數據庫方面的邏輯。

據我所知,對於變更跟蹤實體類都使用了,但是不可能將讀取信息變成任意類嗎?我不想爲每個可能的讀取場景構造實體和數據庫視圖,並且我不想在管道(整個Employee或Manager實體)上發送數據庫的一半,只是爲了讀取名稱屬性等內容。

是否有可能做這種「懶惰而高效的」查詢的實體框架,或實體框架只是沒有考慮到與它建立?我已經遇到了將一個項目從Linq2SQL轉換爲實體框架的許多問題,這可能真的會導致交易失敗。

回答

1

LINQ到實體只支持參數構造函數和初始化器。
更具體地,通過設計,LINQ到實體需要整個LINQ查詢表達式中被翻譯成一個服務器查詢。只有少數不相關的子表達式(在不依賴於來自服務器的結果的查詢表達式)在客戶端上評估的查詢翻譯前。沒有已知的翻譯任意方法調用,並在你的情況參數初始化,是支持。

這就是說,你正在尋找可能是由匿名型投影輕鬆地完成了什麼:

var report = (from manager in entities.Managers 
       select new 
       { 
        Manager = manager.Name, 
        Employees = manager.Employees.Select(e => e.Name) 
       }) 
       .ToList(); 
+0

不幸的是匿名類型的項目被認爲是,但對我來說員工和枚舉的列表之間的區別是有意義的。然而,這仍然回答了我關於EF設計行爲的真正問題。謝謝 – David 2010-12-08 17:50:54