Estou tentando usar .distinct no Linq para obter resultados com base em um campo da tabela (portanto, não exija um registro duplicado inteiro da tabela).
Eu sei escrever consulta básica usando distintas da seguinte maneira:
var query = (from r in table1
orderby r.Text
select r).distinct();
mas preciso de resultados onde r.text
não seja duplicado.
Respostas:
Tente o seguinte:
Isso agrupará a tabela
Text
e usará a primeira linha de cada grupo, resultando em linhasText
distintas.fonte
table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
GroupBy
não cria grupos vazios, veja meu comentário anterior. Muito provavelmente, seu código contém mais do que você vê aqui. Talvez você tenha umWhere
bem ou uma condição para oFirst
.MoreLinq tem um método DistinctBy que você pode usar:
Isso permitirá que você faça:
A implementação do método (sem validação de argumento) é a seguinte:
fonte
GroupBy
precisa de um também. Ambos os métodos usarão o padrãoEqualityComparer
se nenhum for fornecido.Parece que você quer isso:
Isso selecionará as linhas onde
Text
é único.fonte
A resposta de Daniel Hilgarth acima leva a uma
System.NotSupported
exceção Com o Entity-Framework . Com o Entity-Framework , ele deve ser:fonte
Há muitas discussões sobre esse tópico.
Você pode encontrar um deles aqui :
Uma das sugestões mais populares foi o método Distinct, usando uma expressão lambda como parâmetro, como o @Servy apontou.
O arquiteto chefe de C #, Anders Hejlsberg, sugeriu a solução aqui . Também explicando por que a equipe de design da estrutura decidiu não adicionar uma sobrecarga do método Distinct, que usa uma lambda.
fonte
Pelo que encontrei, sua consulta está correta. Basta alterar "selecione r" para "selecionar r.Texto" é tudo e isso deve resolver o problema. É assim que o MSDN documentou como deve funcionar.
Ex:
fonte
fonte
tente este código:
fonte
Você pode tentar isso:
table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();
fonte