Suppose, We have following data source:
table

Now, I want to basically group these users and show the count of browser type they are using. Thus, my output should look like:
user status
Solution:

We need to first group the data by UserIds, and from that result-set we need to again group by individual browser names (excluding their version numbers). Here is the complete code snippet:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. public class Program
  5. {
  6. public static void Main()
  7. {
  8. List<BrowserInfo> browesers = new List<BrowserInfo>
  9. {
  10. new BrowserInfo { UserID = 1, Browser = "Chrome-32.0"},
  11. new BrowserInfo { UserID = 1, Browser = "Chrome-30.0"},
  12. new BrowserInfo { UserID = 1, Browser = "Chrome-33.0"},
  13. new BrowserInfo { UserID = 1, Browser = "Firefox-20.0"},
  14. new BrowserInfo { UserID = 1, Browser = "Firefox-26.0"},
  15. new BrowserInfo { UserID = 1, Browser = "Safari"},
  16. new BrowserInfo { UserID = 1, Browser = "IE 9"},
  17. new BrowserInfo { UserID = 1, Browser = "IE 10"},
  18. new BrowserInfo { UserID = 2, Browser = "Chrome-31.0"},
  19. new BrowserInfo { UserID = 2, Browser = "Chrome-32.0"},
  20. new BrowserInfo { UserID = 2, Browser = "IE 10"},
  21. new BrowserInfo { UserID = 2, Browser = "Firefox-22.0"},
  22. new BrowserInfo { UserID = 2, Browser = "Firefox-20.0"}
  23. };
  24. var query = from browser in browesers
  25. group browser by browser.UserID into UserGroup
  26. from countGroup in
  27. from brow in UserGroup
  28. group brow by new
  29. {
  30. Chrome = brow.Browser.Contains("Chrome"),
  31. Firefox = brow.Browser.Contains("Firefox"),
  32. IE = brow.Browser.Contains("IE")
  33. } into g
  34. select new
  35. {
  36. ChromeCount = g.Key.Chrome ? g.Count() : 0,
  37. FirefoxCount = g.Key.Firefox ? g.Count() : 0,
  38. IECount = g.Key.IE ? g.Count() : 0,
  39. OthersCount = (!g.Key.Chrome && !g.Key.Firefox && !g.Key.IE) ? g.Count() : 0
  40. }
  41. )
  42. group countGroup by UserGroup.Key;
  43. Console.WriteLine("UserId | Chrome | Firefox | IE | Others");
  44. Console.WriteLine("----------------------------------------");
  45. foreach(var users in query)
  46. {
  47. Console.WriteLine("{0} | {1} | {2} | {3} | {4} ",
  48. users.Key, users.Where(x => x.ChromeCount != 0).Select(x => x.ChromeCount).FirstOrDefault(),
  49. users.Where(x => x.FirefoxCount != 0).Select(x => x.FirefoxCount).FirstOrDefault(),
  50. users.Where(x => x.IECount != 0).Select(x => x.IECount).FirstOrDefault(),
  51. users.Where(x => x.OthersCount != 0).Select(x => x.OthersCount).FirstOrDefault()
  52. );
  53. }
  54. }
  55. }
  56. public class BrowserInfo
  57. {
  58. public int UserID { get; set; }
  59. public string Browser { get; set; }
  60. }
Final Output
Ouptput