fork download
  1. using System;
  2. using System.Linq;
  3.  
  4. namespace ConsoleApp1
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var clientes = new[]
  11. {
  12. new { Id = 1, Email = "nome1@email.com", Nome = "Nome 1", Cpf = 1L },
  13. new { Id = 2, Email = "nome2@email.com", Nome = "Nome 2", Cpf = 2L },
  14. new { Id = 3, Email = "nome3@email.com", Nome = "Nome 3", Cpf = 3L },
  15. new { Id = 4, Email = "nome4@email.com", Nome = "Nome 4", Cpf = 4L },
  16. new { Id = 5, Email = "nome5@email.com", Nome = "Nome 5", Cpf = 5L },
  17. };
  18.  
  19. var cartoesClientes = new[]
  20. {
  21. new { Id = 1, ClienteId = 1, CartaoId = 1 },
  22. new { Id = 2, ClienteId = 1, CartaoId = 2 },
  23. new { Id = 3, ClienteId = 2, CartaoId = 3 },
  24. new { Id = 4, ClienteId = 2, CartaoId = 4 },
  25. new { Id = 5, ClienteId = 4, CartaoId = 5 },
  26. new { Id = 6, ClienteId = 4, CartaoId = 6 },
  27. };
  28.  
  29. var cartoes = new[]
  30. {
  31. new { Id = 1, Numero = 1L },
  32. new { Id = 2, Numero = 2L },
  33. new { Id = 3, Numero = 3L },
  34. new { Id = 4, Numero = 4L },
  35. new { Id = 5, Numero = 5L },
  36. new { Id = 6, Numero = 6L },
  37. new { Id = 7, Numero = 7L },
  38. new { Id = 8, Numero = 8L },
  39. new { Id = 9, Numero = 9L },
  40. new { Id = 10, Numero = 10L },
  41. };
  42.  
  43. var historicoTransacaoCartao = new[]
  44. {
  45. new { Id = 1, CartaoId = 1, Valor = 100m },
  46. new { Id = 2, CartaoId = 5, Valor = 100m },
  47. new { Id = 3, CartaoId = 1, Valor = 100m },
  48. new { Id = 4, CartaoId = 3, Valor = 100m },
  49. new { Id = 5, CartaoId = 3, Valor = 100m },
  50. new { Id = 6, CartaoId = 4, Valor = 100m },
  51. new { Id = 7, CartaoId = 1, Valor = 100m },
  52. };
  53.  
  54. var query = from cliente in clientes
  55. join cartaoCliente in cartoesClientes
  56. on cliente.Id equals cartaoCliente.ClienteId
  57. join cartao in cartoes
  58. on cartaoCliente.Id equals cartao.Id
  59. join historico in historicoTransacaoCartao
  60. on cartao.Id equals historico.CartaoId
  61. let x = new
  62. {
  63. cliente.Nome,
  64. cliente.Cpf,
  65. cliente.Email,
  66. cliente.Id,
  67. CartaoId = cartao.Id,
  68. historico.Valor
  69. }
  70. group x by new { ClienteId = cliente.Id, CartaoId = cartao.Id } into g
  71. select new
  72. {
  73. g.First().Nome,
  74. g.First().Cpf,
  75. g.First().Email,
  76. g.First().CartaoId,
  77. Saldo = g.Sum(s => s.Valor)
  78. };
  79.  
  80. Console.WriteLine("Nome CPF E-mail CartaoId Saldo");
  81.  
  82. foreach (var q in query)
  83. {
  84. Console.WriteLine("{0}; {1}; {2}; {3}; {4}",
  85. q.Nome, q.Cpf, q.Email, q.CartaoId, q.Saldo);
  86. }
  87.  
  88. Console.Read();
  89. }
  90. }
  91. }
Success #stdin #stdout 0.02s 132544KB
stdin
Standard input is empty
stdout
Nome CPF E-mail CartaoId Saldo
Nome 1; 1; nome1@email.com; 1; 300
Nome 2; 2; nome2@email.com; 3; 200
Nome 2; 2; nome2@email.com; 4; 100
Nome 4; 4; nome4@email.com; 5; 100