2012-08-10 103 views
1

我正在嘗試做一些我不確定LINQ可以做的事情 - 但我們試試吧! 我有2個班;一個是另一個的列表結構:Linq查詢填充複雜模型?

public class1 { 
    public int id {get; set;} 
    public string title {get; set;} 
    public List<class2> subcat {get; set;} 
} 
public class2 { 
    public int Value {get; set;} 
    public string Text {get; set;} 
} 

是否有可能用LINQ填充這樣的結構?例如:

return (from r in results 
    from sub in subresults.Where(sub => sub.id == r.subid).DefaultIfEmpty() 
    select new class1 { 
     id = r.id, 
     title = r.title, 
     subcat = [GET TWO COLUMNS FROM 'SUB' INTO THIS] 
    }).ToList() 

這可能嗎?我討厭通過使用嵌套循環等手動建立它們。
在此先感謝!

+0

葉氏,您可以通過使用JOIN()...但是,我認爲它不會減少太多,因爲你必須建立創建Class1的 – 2012-08-10 21:05:04

回答

3

這是你所需要的?

return (from r in results 
    select new class1 { 
     id = r.id, 
     title = r.title, 
     subcat = (from sub in subresults 
       where sub.id == r.subid 
       select new class2 { Value = sub.Value, Text = sub.Text }).ToList() 

    }).ToList() 
+0

的查詢我認爲這會工作減少這種複雜的查詢! - 我現在就試一試。同時,選擇是爲每個記錄運行,還是以子查詢的形式呈現(一個select語句返回,一個記錄集返回)? – Losbear 2012-08-10 21:07:36

+0

後者。這是一個選擇N + 1(問題)。 – usr 2012-08-10 21:08:31

+0

也許我做錯了什麼,但現在我得到一個錯誤 - 它就會消失,如果我刪除「SUBCAT =(從...)ToList()字段: LINQ到實體無法識別方法「。 System.Collections.Generic.List'1 [BluArcCrm.ViewModels.Contact_Index_GroupFolders] ToList [Contact_Index_GroupFolders](System.Collections.Generic.IEnumerable'1 [BluArcCrm.ViewModels.Contact_Index_GroupFolders])」方法,和這種方法不能被翻譯成存儲表達式 – Losbear 2012-08-10 21:21:47

0

您可以使用導航屬性在一個查詢中加載結果和子結果。

from r in results 
select new class1 { 
    id = r.id, 
    title = r.title, 
    subcat = r.Subresults.Select(sr => 
      new class2 { Value = sr.Value, Text = sr.Text }) 

...假定導航屬性result.Subresults存在或以其他方式可以爲了方便而創建。

AutoMapper在這裏也很有用。如果你定義了兩個映射(result => class1,subresult => class2),它將自動加載嵌套集合。