using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var clientes = new[]
{
new { Id = 1, Email = "nome1@email.com", Nome = "Nome 1", Cpf = 1L },
new { Id = 2, Email = "nome2@email.com", Nome = "Nome 2", Cpf = 2L },
new { Id = 3, Email = "nome3@email.com", Nome = "Nome 3", Cpf = 3L },
new { Id = 4, Email = "nome4@email.com", Nome = "Nome 4", Cpf = 4L },
new { Id = 5, Email = "nome5@email.com", Nome = "Nome 5", Cpf = 5L },
};
var cartoesClientes = new[]
{
new { Id = 1, ClienteId = 1, CartaoId = 1 },
new { Id = 2, ClienteId = 1, CartaoId = 2 },
new { Id = 3, ClienteId = 2, CartaoId = 3 },
new { Id = 4, ClienteId = 2, CartaoId = 4 },
new { Id = 5, ClienteId = 4, CartaoId = 5 },
new { Id = 6, ClienteId = 4, CartaoId = 6 },
};
var cartoes = new[]
{
new { Id = 1, Numero = 1L },
new { Id = 2, Numero = 2L },
new { Id = 3, Numero = 3L },
new { Id = 4, Numero = 4L },
new { Id = 5, Numero = 5L },
new { Id = 6, Numero = 6L },
new { Id = 7, Numero = 7L },
new { Id = 8, Numero = 8L },
new { Id = 9, Numero = 9L },
new { Id = 10, Numero = 10L },
};
var historicoTransacaoCartao = new[]
{
new { Id = 1, CartaoId = 1, Valor = 100m },
new { Id = 2, CartaoId = 5, Valor = 100m },
new { Id = 3, CartaoId = 1, Valor = 100m },
new { Id = 4, CartaoId = 3, Valor = 100m },
new { Id = 5, CartaoId = 3, Valor = 100m },
new { Id = 6, CartaoId = 4, Valor = 100m },
new { Id = 7, CartaoId = 1, Valor = 100m },
};
var query = from cliente in clientes
join cartaoCliente in cartoesClientes
on cliente.Id equals cartaoCliente.ClienteId
join cartao in cartoes
on cartaoCliente.Id equals cartao.Id
join historico in historicoTransacaoCartao
on cartao.Id equals historico.CartaoId
let x = new
{
cliente.Nome,
cliente.Cpf,
cliente.Email,
cliente.Id,
CartaoId = cartao.Id,
historico.Valor
}
group x by new { ClienteId = cliente.Id, CartaoId = cartao.Id } into g
select new
{
g.First().Nome,
g.First().Cpf,
g.First().Email,
g.First().CartaoId,
Saldo = g.Sum(s => s.Valor)
};
Console.WriteLine("Nome CPF E-mail CartaoId Saldo");
foreach (var q in query)
{
Console.WriteLine("{0}; {1}; {2}; {3}; {4}",
q.Nome, q.Cpf, q.Email, q.CartaoId, q.Saldo);
}
Console.Read();
}
}
}
ICAgIHVzaW5nIFN5c3RlbTsKICAgIHVzaW5nIFN5c3RlbS5MaW5xOwogICAgCiAgICBuYW1lc3BhY2UgQ29uc29sZUFwcDEKICAgIHsKICAgICAgICBjbGFzcyBQcm9ncmFtCiAgICAgICAgewogICAgICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBjbGllbnRlcyA9IG5ld1tdCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSAxLCBFbWFpbCA9ICJub21lMUBlbWFpbC5jb20iLCBOb21lID0gIk5vbWUgMSIsIENwZiA9IDFMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSAyLCBFbWFpbCA9ICJub21lMkBlbWFpbC5jb20iLCBOb21lID0gIk5vbWUgMiIsIENwZiA9IDJMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSAzLCBFbWFpbCA9ICJub21lM0BlbWFpbC5jb20iLCBOb21lID0gIk5vbWUgMyIsIENwZiA9IDNMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSA0LCBFbWFpbCA9ICJub21lNEBlbWFpbC5jb20iLCBOb21lID0gIk5vbWUgNCIsIENwZiA9IDRMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSA1LCBFbWFpbCA9ICJub21lNUBlbWFpbC5jb20iLCBOb21lID0gIk5vbWUgNSIsIENwZiA9IDVMIH0sCiAgICAgICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgICAgICB2YXIgY2FydG9lc0NsaWVudGVzID0gbmV3W10KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDEsIENsaWVudGVJZCA9IDEsIENhcnRhb0lkID0gMSB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gMiwgQ2xpZW50ZUlkID0gMSwgQ2FydGFvSWQgPSAyIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSAzLCBDbGllbnRlSWQgPSAyLCBDYXJ0YW9JZCA9IDMgfSwKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDQsIENsaWVudGVJZCA9IDIsIENhcnRhb0lkID0gNCB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gNSwgQ2xpZW50ZUlkID0gNCwgQ2FydGFvSWQgPSA1IH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSA2LCBDbGllbnRlSWQgPSA0LCBDYXJ0YW9JZCA9IDYgfSwKICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgIHZhciBjYXJ0b2VzID0gbmV3W10KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDEsIE51bWVybyA9IDFMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSAyLCBOdW1lcm8gPSAyTCB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gMywgTnVtZXJvID0gM0wgfSwKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDQsIE51bWVybyA9IDRMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSA1LCBOdW1lcm8gPSA1TCB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gNiwgTnVtZXJvID0gNkwgfSwKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDcsIE51bWVybyA9IDdMIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSA4LCBOdW1lcm8gPSA4TCB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gOSwgTnVtZXJvID0gOUwgfSwKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDEwLCBOdW1lcm8gPSAxMEwgfSwKICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgIHZhciBoaXN0b3JpY29UcmFuc2FjYW9DYXJ0YW8gPSBuZXdbXQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gMSwgQ2FydGFvSWQgPSAxLCBWYWxvciA9IDEwMG0gfSwKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDIsIENhcnRhb0lkID0gNSwgVmFsb3IgPSAxMDBtIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSAzLCBDYXJ0YW9JZCA9IDEsIFZhbG9yID0gMTAwbSB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gNCwgQ2FydGFvSWQgPSAzLCBWYWxvciA9IDEwMG0gfSwKICAgICAgICAgICAgICAgICAgICBuZXcgeyBJZCA9IDUsIENhcnRhb0lkID0gMywgVmFsb3IgPSAxMDBtIH0sCiAgICAgICAgICAgICAgICAgICAgbmV3IHsgSWQgPSA2LCBDYXJ0YW9JZCA9IDQsIFZhbG9yID0gMTAwbSB9LAogICAgICAgICAgICAgICAgICAgIG5ldyB7IElkID0gNywgQ2FydGFvSWQgPSAxLCBWYWxvciA9IDEwMG0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gZnJvbSBjbGllbnRlIGluIGNsaWVudGVzCiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gY2FydGFvQ2xpZW50ZSBpbiBjYXJ0b2VzQ2xpZW50ZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBjbGllbnRlLklkIGVxdWFscyBjYXJ0YW9DbGllbnRlLkNsaWVudGVJZAogICAgICAgICAgICAgICAgICAgICAgICBqb2luIGNhcnRhbyBpbiBjYXJ0b2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBjYXJ0YW9DbGllbnRlLklkIGVxdWFscyBjYXJ0YW8uSWQKICAgICAgICAgICAgICAgICAgICAgICAgam9pbiBoaXN0b3JpY28gaW4gaGlzdG9yaWNvVHJhbnNhY2FvQ2FydGFvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBjYXJ0YW8uSWQgZXF1YWxzIGhpc3Rvcmljby5DYXJ0YW9JZAogICAgICAgICAgICAgICAgICAgICAgICBsZXQgeCA9IG5ldwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRlLk5vbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRlLkNwZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudGUuRW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRlLklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FydGFvSWQgPSBjYXJ0YW8uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3JpY28uVmFsb3IKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBncm91cCB4IGJ5IG5ldyB7IENsaWVudGVJZCA9IGNsaWVudGUuSWQsIENhcnRhb0lkID0gY2FydGFvLklkIH0gaW50byBnCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLk5vbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLkZpcnN0KCkuQ3BmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkVtYWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5GaXJzdCgpLkNhcnRhb0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FsZG8gPSBnLlN1bShzID0+IHMuVmFsb3IpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJOb21lIENQRiBFLW1haWwgQ2FydGFvSWQgU2FsZG8iKTsKICAgIAogICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHEgaW4gcXVlcnkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInswfTsgezF9OyB7Mn07IHszfTsgezR9IiwKICAgICAgICAgICAgICAgICAgICAgICAgcS5Ob21lLCBxLkNwZiwgcS5FbWFpbCwgcS5DYXJ0YW9JZCwgcS5TYWxkbyk7CiAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgIENvbnNvbGUuUmVhZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQ==