2013-01-31 13 views
7

Próbuję użyć LINQ (do EF), aby uzyskać listę DISTINCT, a następnie ją posortować. Wszystkie znalezione przykłady sortują wynik na podstawie wartości DISTINCT. Ale chcę posortować to na innym polu.LINQ: Distinct and Orderby

Przykład: Tabela z 2 polami (canvasSize i canvasLength);

var sizes = (from s in ent.competitors       
      select s.canvasSize).Distinct().OrderBy(x => x); 

Wszystkie znalezione przykłady dają tego rodzaju odpowiedź. Ale sortuje według canvasSize, podczas gdy ja chcę sortować według canvasLength.

utknąłem ... Wszelkie wskazówki są bardzo mile widziane ...

Per J. Skeet> Dodatkowe informacje:

company canvasSize canvasLength 

abc  8x10   8 
d   8x10   8 
e   10x10  10 
f   10x10  10 
g   40x40  40 

chciałbym go mieć odrębny na canvasSize. Problem polega na tym, że gdy sortowane, to wyniki w tej kolejności:

10x10 
40x40 
8x10 

chciałbym ten sam zestaw wyników, ale klasyfikowane za pomocą canvasLength więc wynik jest:

8x10 
10x10 
40x40 
+0

No co chcesz go mieć odrębny * od *? Byłoby bardzo pomocne, gdybyś mógł podać przykładowe dane i oczekiwane rezultaty. –

+0

A więc, czy chcesz mieć w wynikach zarówno canvasSize i canvasLength, posortowane według canvasLength? –

+0

Ile danych masz do czynienia? Ścieżka najmniejszego oporu polega na wykonaniu porządku na kolumnie A na poziomie DB, wybierz dwie kolumny i przenieś je do pamięci, a następnie wybierz swoją pojedynczą kolumnę B i użyj odmiennie po stronie pamięci. Łatwo to napisać. Może jednak nie skalować się, jeśli masz dużo danych. (To zakłada, że ​​baza danych nie gwarantuje zachowania porządku przy użyciu Distinct, a jeśli tak, to trzymaj się DB.) –

Odpowiedz

10

myślę, czego „re po może być coś takiego:

var sizes = (from s in ent.competitors       
      select new { s.canvasSize, s.canvasLength }) 
      .Distinct() 
      .OrderBy(x => x.canvasLength); 

Aktualizacja

Na podstawie dodatkowych informacji w swoim pytaniu, następujące powinny robić to, co chcesz:

var sizes = ent.competitors 
       .Select(c => new {c.canvasSize, c.canvasLength}) 
       .Distinct() 
       .OrderBy(x => x.canvasLength) 
       .Select(x => x.CanvasSize) 
+0

W tym szczególnym przypadku, gdy pola zależą od siebie nawzajem, powinno to działać, ponieważ jeśli 'canvasSize' jest identyczny, podobnie jak "canvasLength". Gdyby zmieniały się niezależnie, stanowiłoby to problem. –

+0

@JoachimIsaksson - Zgoda, ale wtedy wystarczy dodać selektor kluczy do wywołania 'Distinct()'. –

+0

@AndrewCooper: to jest prawie odpowiedź, chcę tylko canvasSize w wyniku, ale chcę końcowy wynik posortowany według canvasLength – nanonerd

2
var sizes = ent.competitors 
       .GroupBy(s => s.canvasSize) 
       .Select(g => g.First()) 
       .OrderBy(s => s.canvasLength); 
Powiązane problemy