2012-04-10 124 views
0

我正在執行查詢,在該查詢中將查詢投影到使用列表的業務對象中。問題是Linq對實體抱怨說:「LINQ to Entities只支持無參數的構造函數和初始化器。」投影包含列表的新項目

我一直在拉我的頭髮在這一個。我的查詢看起來是這樣的:

var q = from d in db.Items select new BusinessObject 
    { 
     MyList = new List<MyObject>(d.Select(x => new MyObject {// set fields}) 
    } 

我不能使用初始化爲似乎只接受一個單一的項目,還沒有收集。我不能做一個.ToList(),因爲EF然後抱怨它不知道MyObject的列表是什麼(顯然,它試圖將它轉換爲SQL)。

我無法在查詢之外創建列表,因爲我需要父表中每一行的新列表。

此處有任何建議嗎?

+0

@HenkHolterman - 的定義是不相關的,除了一個事實,即MYLIST是一個列表(這是從代碼明顯)。 MyObject中的字段是不相關的,並且與問題無關。 – 2012-04-10 21:59:03

回答

0

該查詢看起來很奇怪 - 什麼是db?它應該是你的上下文還是你的上下文的IQueryable屬性?

假設您的上下文,您可以嘗試在查詢BusinessObject集合時加載items屬性(這是什麼?)的集合,然後轉換爲List,然後將items屬性項目投影到List上內存中的集合:

var q = db.BusinessObjectsContextProperty.Select(d => d.items) //eager load the items property 
    .ToList() // get it into memory 
    .Select(d => new BusinessObject { MyList = d.items 
     .Select(item => new MyObject { ... }) // project the in-memory list 
    ); 
+0

對不起,在查詢的第一部分中的拼寫錯誤,應該是db.Items(是的,它是一個DbSet)。這是一個更復雜的查詢的大大簡化。將它拉到最上面的內存將導致數十萬條記錄被帶入內存。 – 2012-04-10 22:08:52

+1

如果你在正確的位置執行ToList,它不應該導致更多的行比必要的被帶入內存,如果它..? – 2012-04-10 22:12:57

相關問題