2011-06-11 109 views
0

,我有以下數據:集團LINQ

 
CourseID Month 
100  Jan 
100  Feb 
101  Jan 
102  May 
102  Jun 
102  July 

我想編寫一個LINQ查詢返回的數據如下(包括引號):

 
CourseID Months 
100  Jan, Feb 
101  Jan 
102  May, Jun, July 

我做的怎麼辦這個?

+0

你看看'GroupBy','Aggregate'和'Select'? – bzlm 2011-06-11 15:14:00

回答

7

試試這個:

courses.GroupBy(c => c.CourseID) 
    .Select(g => new 
    { 
     Id = g.Key, 
     Months = String.Join(", ", g.Select(c => c.Month).ToArray()) 
    }); 

如果你使用.NET 4.0,你不需要ToArray的調用,因爲的string.join有一個新的重載採取IEnumerable。

解釋它是如何工作:

首先,組組由CourseID課程。這將返回IEnumerable<IGrouping<int, Course>> - 枚舉中的每個元素都包含一個名爲Key的屬性 - 這是所有分組到它的課程的CourseID。

這一點是關鍵:IGrouping也是一個IEnumerable<Course> - 這意味着它可以通過返回在Key中保存的ID下分組的每個元素進行迭代。

所有的最後部分也就是選擇有兩個屬性,Id和月新的匿名類型:

  • ID設置爲密鑰(CourseID)
  • 月設定爲加入的結果在一起分組課程的所有月份值。這是通過使用String.Join完成的,因爲它可以輕鬆地爲值指定分隔符。
+0

非常感謝這個String.Join – VeecoTech 2011-06-11 23:39:51

0

GroupBy()經營者應幫助您開始

2
var q = 
    from course in courses 
    group course by course.CourseID into courseGroup 
    select new 
    { 
     CourseId = courseGroup.Key, 
     Months = string.Join(", ", (
      from c in courseGroup 
      select c.Month).ToArray()) 
    }; 
2

LINQ查詢相當簡單:

var courses = new List<Course> 
     { 
      new Course(){ CourseId = 100, Month = "JAN"}, 
      new Course(){ CourseId = 100, Month = "FEB"}, 
      new Course(){ CourseId = 101, Month = "JAN"}, 
     }; 
var q = from course in courses group course by course.CourseId into grouping select new { CourseId = grouping.Key, Months = string.Join(", ", grouping.Select(value => value.Month)) };