2013-11-23 58 views
2

必須做很多東西才能獲得IGrouping在MVC4中工作c#。下面是我的查詢這是怎麼發生的?

 var a = (from r in db.SomeProcedure(Id) 
         select new MyClass1 
         { 
          Id= r.Id, 
          Title = r.Title, 
          Name = r.Name, 
          Number = r.Number, 
          Product = r.Product, 
          OtherId = r,OtherId 
         }).ToList(); 

//以上收益13個結果如預期

 var b = a.GroupBy(x => x.Title ?? "unknown", c => new MyClass2 
     { 
      Title2 = c.Title, 
      Id2 = c.Id, 
      OtherId2 = c.OtherId, 
      Number2 = c.Number 
     }); 

//以上收益2如預期

 List<MyClass1> mClass1 = a; 
     List<IGrouping<string,MyClass2>> mClass2 = b.ToList(); 

// 2.以上是相同的如預期的那樣

最後

 mPrivateClass1.Clear(); 
     mClass1 .ForEach(o => mPrivateClass1.Add(o)); 

//以上是13如預期

 mPrivateClass2.Clear(); 
     mClass2 .ForEach(p => mPrivateClass2.AddRange(p)); 

//以上正在返回13中未2按預期方式。我無法使用Add(p)它給出了通用列表<> .Add有一些無效的參數。

mPrivateClass1 is a: 
private List<MyClass1> mPrivateClass1 = new List<MyClass1>(); 

mPrivateClass2 is a: 
private List<MyClass2> mPrivateClass2 = new List<MyClass2>(); 

回答

1
mPrivateClass2.Clear(); 
mClass2 .ForEach(p => mPrivateClass2.AddRange(p)); 
//The above is returning 13 not 2 as expected. 

爲什麼你會喜歡它返回只有2個元素?因爲你使用AddRange,整個分組的內容添加到您的List,因爲IGrouping<TKey, TElement>實現IEnumerable<TElement>將歸類到該組的所有元素,你得到13.這對你的代碼的預期和期望的價值。

爲了讓只有2 mPrivateClass2元素,你將不得不決定,應加入哪個元素從組。例如,從每個組使用後只添加第一個項目:

mClass2.ForEach(p => mPrivateClass2.Add(p.First())); 

您可以添加其他的方法,如OrderBy,在IGrouping的內容進行分類採取一個項目之前:

mClass2 .ForEach(p => mPrivateClass2.Add(p.OrderBy(x => Id).First())); 
+0

想要把標題放在一個面板中,所以2個標題首先將第一個查詢的結果作爲孩子 – user1307149

1

這是因爲即使您在mClass2中有2個組,您在兩個組中也有13個組合,當您撥打mPrivateClass2.AddRange時,您將添加爲IEnumerable<MyClass2>

從每個MyClass2組的兩個元素,你會希望添加?