c # - linq distinkt og vælg ny forespørgsel

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en forespørgsel


var QP = (from a in QProductAllInfo select new { a.Id, a.Title, a.FullTitle}).Distinct();


Resultatet er:



  • 1 Ivanov Ivan

  • 1 Ivanov Ivan

  • 2 Petrov Petr

  • 3 Sidorov Ivan

  • 3 Sidorov Ivan



og jeg har brug for resultatet:



  • 1 Ivanov Ivan

  • 2 Petrov Petr

  • 3 Sidorov Ivan


Bedste reference


Forudsat at forskellige Ids altid betragtes som særskilte, kan du prøve dette.


Jeg ville nok skrive det i to querys. På den måde er det nemt at debugere og læses mere. Du kan bruge MoreLinq.


DistinctBy [7]


Hent [8]


var temp = from a in QProductAllInfo select new { a.Id, a.Title, a.FullTitle}.ToList();

var result = temp.DistinctBy(i => i.Id);


Du kan også bruge


Var result = temp.GroupBy(x => x.Id).Select(y => y.First());

Andre referencer 1


Hvis du har dubletter i QProductAllInfo, skal du udskifte din kode ved at erstatte din kode.


var QP = from a in QProductAllInfo.Distinct() 
         select new { a.Id, a.Title, a.FullTitle };


Hvis dette ikke virker, kan du bruge tuples i stedet for anonyme typer som denne:


var QP = from a in QProductAllInfo
         select Tuple.Create(a.Id, a.Title, a.FullTitle);


Anvendelse af den Distinct operatør på anonyme typer er ubrugelig, fordi anonyme typer altid er referencetyper, som donc implementerer den IEquatable interface.

Andre referencer 2


Du kan implementere en IEqualitycomparer som .Distinkt brug for at bestemme om varen allerede findes på listen. Det kan sammenligne på attributter i stedet for henvisning til samme objekt.


Men jeg ved ikke, om det virker på anonyme typer.