Advertisement
Guest User

Untitled

a guest
Apr 15th, 2012
536
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.21 KB | None | 0 0
  1. Row_number over (Partition by xxx) in Linq?
  2. id | inst | name
  3. ____________________
  4. 1 | guitar | john
  5. 2 | guitar | george
  6. 3 | guitar | paul
  7. 4 | drums | ringo
  8. 5 | drums | pete
  9.  
  10. IEnumerable <beatle>...
  11.  
  12. class Beatle
  13. {
  14. int id;
  15. string inst;
  16. string name ;
  17. }
  18.  
  19. select *,Row_Number() over (partition by inst order by id) as rn from myTalbe
  20.  
  21. inst | name | rn
  22. _____________________
  23. guitar | john | 1
  24. guitar | george | 2
  25. guitar | paul | 3
  26. drums | ringo | 1
  27. drums | pete | 2
  28.  
  29. var o = beatles.OrderBy(x => x.id).GroupBy(x => x.inst)
  30. .Select(g => new {g, count= g.Count()})
  31. .SelectMany(t => t.g.Select(b => b)
  32. .Zip(Enumerable.Range(1,t.count), (j,i) => new {j.inst, j.name, rn = i}));
  33.  
  34. foreach (var i in o)
  35. {
  36. Console.WriteLine("{0} {1} {2}", i.inst, i.name, i.rn);
  37. }
  38.  
  39. Guitar John 1
  40. Guitar George 2
  41. Guitar Paul 3
  42. drums Ringo 1
  43. drums Pete 2
  44.  
  45. var grouped = beatles.OrderBy( x => x.id )
  46. .ToList() // required because SelectMany below doesn't evaluate to SQL
  47. .GroupBy( x => x.inst );
  48. var rns = grouped.ToDictionary( x => x.Key, x => 1 );
  49. var result = grouped
  50. .SelectMany( x => x.Select(
  51. y => new { inst = y.inst, name = y.name, rn = rns[y.inst]++ } ) );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement