Mam dwie tabele movies
i najpierw categories
otrzymuję uporządkowaną listę według kategorii ID, a następnie Nazwy .
Tabela filmów ma trzy kolumny Identyfikator, Nazwa i ID kategorii . Tabela kategorii ma dwie kolumny Identyfikator i Nazwa .
Próbowałem czegoś takiego, ale to nie zadziałało.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
linq
sql-order-by
Sasha
źródło
źródło
Odpowiedzi:
To powinno Ci pomóc:
źródło
Var movies = _db.Movies.Orderby(c => c.Category).ThenBy(n => n.Name)
jeśliVar movies = _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
użyję 2 razy „orderBy”, dlaczego wynik jest inny?ThenBy
! ( Edycja: wygląda na to, że został wprowadzony w .NET 4.0, co wyjaśnia, jak przeszedł obok mnie niezauważony.)Używając LINQ innej niż lambda, składni zapytania, możesz to zrobić:
[EDYCJA, aby skomentować komentarz] Aby kontrolować porządek sortowania, użyj słów kluczowych
ascending
(które są domyślne i dlatego nie są szczególnie przydatne) lubdescending
, w ten sposób:źródło
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Bardziej poprawne jestfrom row in _db.Movies orderby row.Category descending orderby row.Name select row
_db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)
. Dwa podane fragmenty kodu są sobie równe, a nie OP.Dodaj nowe":
To działa na moim pudełku. Zwraca coś, co można wykorzystać do sortowania. Zwraca obiekt o dwóch wartościach.
Podobne, ale inne niż sortowanie według połączonej kolumny, jak następuje.
źródło
.OrderBy( m => new { m.CategoryID, m.Name })
i.OrderBy( m => new { m.Name, m.CategoryID })
będzie produkować takie same wyniki niż poszanowaniem zamierzony priorytet. Czasami wydaje się, że daje ci porządek, który chcesz wyłącznie przez przypadek. Dodatkowom.CategoryID.ToString() + m.Name
wygeneruje nieprawidłowe zamówienia, jeśli CategoryID toint
. Na przykład coś o id = 123, nazwa = 5 razy pojawi się po id = 1234, nazwa = coś zamiast wcześniej. Nie jest również nieefektywne porównywanie ciągów, w których mogą wystąpić porównania int.użyj następującego wiersza w DataContext, aby zarejestrować działanie SQL w DataContext w konsoli - wtedy możesz zobaczyć dokładnie, czego żądają twoje instrukcje linq z bazy danych:
Następujące instrukcje LINQ:
I
utworzyć następujący kod SQL:
Podczas gdy powtarzanie OrderBy w Linq wydaje się odwracać wynikowy wynik SQL:
I
utworzyć następujący kod SQL (nazwy i identyfikator kategorii są przełączane):
źródło
Stworzyłem kilka metod rozszerzenia (poniżej), więc nie musisz się martwić, czy IQueryable jest już zamówiony, czy nie. Jeśli chcesz zamówić według wielu właściwości, zrób to w następujący sposób:
Jest to szczególnie przydatne, jeśli tworzysz porządek dynamicznie, np. Z listy właściwości do sortowania.
źródło
nullable datetime
Jest co najmniej jeden sposób, aby to zrobić za pomocą LINQ, choć nie najłatwiejszy. Możesz to zrobić przy użyciu
OrberBy()
metody wykorzystującejIComparer
. Najpierw musisz zaimplementowaćIComparer
dla takiejMovie
klasy:Następnie możesz zamówić filmy o następującej składni:
Jeśli chcesz zmienić kolejność na malejącą dla jednego z elementów, po prostu przełącz xiy wewnątrz
Compare()
metodyMovieComparer
odpowiednio.źródło
MovieComparer
; zamiast tego możesz zrobić_db.Movies.OrderBy(item => item, Comparer<Movie>.Create((x, y) => { if (x.CategoryId == y.CategoryId) { return x.Name.CompareTo(y.Name); } else { return x.CategoryId.CompareTo(y.CategoryId); } }));
. Oczywiście, jeśli wolisz napisać logikę jako jedno wyrażenie, zamiastif
...else
, lamda(x, y) => expr
może być prostsza.Jeśli używasz ogólnego repozytorium
jeszcze
źródło