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); 
}