2017-08-16 109 views
2

我有一個實體框架請求檢索許多不同的信息,使用幾個內部聯接,所以我使用動態列表作爲返回類型,但我似乎無法找到一種方法來使其工作當迭代它時。迭代通過列表<dynamic>

我提出的要求,有4個表,但我再舉一個例子,以簡化,說我有表RoomKitchen

var result = from r in Room 
      join k in Kitchen on r.idKitchen=k.id 
      where (r.id == myIDPassedAsParameter) 
      select new { rId = r.id, kId = k.id} 
      .ToList<dynamic>(); 

現在正試圖訪問它我這樣做的時候:

foreach (var r in result) 
{ 
    foreach (var item in r) 
    { 
     Console.WriteLine(item.rId + " " + item.kId); 
    } 

} 

我不斷收到第二個foreach的轉換異常。我找不到解決這個問題的方法。我最初使用它是因爲我返回的結果是匿名類型的,所以這就是我發現使返回成爲可能的原因。

謝謝

+1

首先,你爲什麼要將它轉換爲「動態」列表?其次,嵌套列表意味着數據是不正確的列表列表。你究竟想要做什麼? – DavidG

+0

我會避免使用'動態',除非你真的知道你在做什麼。你能至少使用'object'嗎? – user2023861

+0

我強烈建議創建一個類型來處理結果。我不知道你爲什麼有兩個foreach。查詢的結果應該是這樣的'變種dynamicList =新名單 { 新{RID = 1,KID = 1}, 新{RID = 2,孩子= 2}, 新{RID = 3, kId = 3}, new {rId = 4,kId = 4} };' –

回答

5

正如我在評論說,我應該這樣做

private class RoomKitchenPair 
    { 
     public int RoomId { get; set; } 

     public int KitchenId { get; set; } 
    } 

var result = (from r in Room 
     join k in Kitchen on r.IdKitchen equals k.Id 
     where (r.Id == myIDPassedAsParameter) 
     select new RoomKitchenPair { RoomId= r.Id, KitchenId = k.Id}) 

foreach (var r in result) 
{ 
    Console.WriteLine(r.RoomId + " - " + r.KitchenId); 
} 
+0

是的,我要做到這一點,似乎更簡單,合理,謝謝:) –

-1

只是做;

var result = (from r in Room 
      join k in Kitchen on r.idKitchen=k.id 
      where (r.id == myIDPassedAsParameter) 
      select new { rId = r.id, kId = k.id}) 
      .ToList<dynamic>(); 

foreach (var r in result) 
    { 
      Console.WriteLine(r.rId + " " + r.kId); 

    } 

您已經

select new { rId = r.id, kId = k.id} 
+0

這引發了一個異常「對象不包含rId的定義」 –

+0

@Reedwanul你的最後一句是不正確的,這不是一個動態的類型,它是一個匿名對象。這兩件事情非常不同。 – DavidG

1

創建動態的對象。如果你只打算重複在foreach循環的結果,你不需要ToList無論如何,因爲結果本身是IEnumerable。 此外,它是一個IEnumerable<T>其中T是你的匿名類型 - 所以你只需要一個foreach循環:

var result = from r in Room 
      join k in Kitchen on r.idKitchen=k.id 
      where (r.id == myIDPassedAsParameter) 
      select new { rId = r.id, kId = k.id} 

foreach (var item in result) 
{ 
    Console.WriteLine("{0} {1}", item.rId, item.kId); 
}