Distinct List

Olá pessoal hoje eu vou falar e mostrar a você um problema e logo após uma solução real. Lembro que todos os exemplos que registro aqui no site ecode10.com são exemplos reais que passo no dia a dia da empresa onde trabalho.

Lembro que foi utilizado:

  • Ferramenta Visual Studio
  • Linguagem C#
  • Plataforma .NETCore

O exemplo colocado aqui pode ser usado em qualquer plataforma .NETCore, Web, Api, Console e Desktop, vamos ao problema.

Problema

Eu tenho uma API na empresa que precisa consultar três tabelas diferentes no banco de dados MongoDB, procurar por qualquer tipo de valor em qualquer campo dele. Como os dados podem se repetir, então eu preciso retirar o que está repetido no final para assim então retornar ao usuário que chamou a API, nesse caso um sistema feito em AngularJS.

Solução

O primeiro de tudo é criar uma classe com todas as propriedades que precisa ou que existe no banco de dados. Veja o código 1.1.

public class AttributesModel
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string _id { get; set; }

    [BsonElement("ProductName")]
    public string ProductName { get; set; }

    [BsonElement("ProductType")]
    public string ProductType { get; set; }

    [BsonElement("STN")]
    public string STN { get; set; }

    [BsonElement("RegulatoryStatus")]
    public string RegulatoryStatus { get; set; }

    [BsonElement("ItemNumber")]
    public string ItemNumber { get; set; }

    [BsonElement("UPC")]
    public string UPC { get; set; }

    [BsonElement("data")]
    public List<AttributesDataModel> data { get; set; }

}

public class AttributesDataModel
{
    [BsonElement("Title")]
    [BsonSerializer(typeof(BsonStringNumericSerializer))]
    public string Title { get; set; }

    [BsonElement("CurrentProduct")]
    [BsonSerializer(typeof(BsonStringNumericSerializer))]
    public string CurrentProduct { get; set; }

    [BsonElement("PredicateProduct")]
    [BsonSerializer(typeof(BsonStringNumericSerializer))]
    public string PredicateProduct { get; set; }

    [BsonElement("AmendedName")]
    [BsonSerializer(typeof(BsonStringNumericSerializer))]
    public string AmendedName { get; set; }
}

image

Veja esse ebook mostrando passo a passo como criar uma API - https://mauriciojunior.net/book/1/Web-API-na-linguagem-CSharp

Note que no código 1.1 eu tenho vários elementos e eles tem uma lista dentro da lista. Depois que fiz toda a lista com os dados, montei o Json e a deserialização do objeto baseado na classe de atributos criada, é necessário trabalhar em cima dela. Eu utilizei o Newtsonsoft para deserializar o Json para a lista. Veja o código 1.2.

Código 1.2 - Deserializar o json para a lista

var attributes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AttributesModel>>(jsonData);

O código 1.2 faz com que os dados em JSon se transforme em uma lista com os nomes separados e assim podemos usar Linq ou qualquer outro tipo de busca ou atributo pelo nome.

Os dados podem ser repetidos porque não tenho join no select statement entre as tabelas e dessa forma eu preciso fazer um distinct através de um campo ou atributo da classe. Vamos fazer o distinct, veja o código 1.3.

Código 1.3 - Distinct dos dados

//distinct
var attributesDistinct = attributes.GroupBy(x => x.ItemNumber).Select(y => y.First()).ToList();

O primeiro passo foi pegar os atributos e fazer um grupo by. Depois disso eu escolho o ItemNumber e faço um select em cima dele para pegar o primeiro dado repetido, descartar os outros e retornar uma lista.

Assim o dados que eram 30 no código 1.2 se tornaram 25 baseado na minha pesquisa.

Eu fico por aqui e espero ter te ajudado com mais um artigo. Você pode me encontrar na rede social @mauriciojunior_net_ ou pelo meu site mauriciojunior.net e qualquer dúvida pode entrar em contato!

  • Mauricio Junior

    Mauricio Junior