Am doua tabele, filme
și "categorii", și am obține o listă ordonată de categoryID în primul rând și apoi de Numele.
Filmul tabelul are trei coloane ID-ul, Numele și CategoryID. Tabelul categorie are două coloane ID-ul și Numele.
Am încercat ceva, cum ar fi următoarele, dar nu't de lucru.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
Folosind non-lambda, query-sintaxa LINQ, puteți face acest lucru:
var movies = from row in _db.Movies
orderby row.Category, row.Name
select row;
[EDIT la adresa comentariu] Pentru a controla ordinea de sortare, de a folosi cuvinte cheie ascendent
(care este implicit și, prin urmare, nu deosebit de utile) sau descendent
, astfel:
var movies = from row in _db.Movies
orderby row.Category descending, row.Name
select row;
Adăugați "noi":
var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })
Care funcționează pe cutia mea. Nu reveni ceva care poate fi folosit pentru a sorta. Returnează un obiect cu două valori.
Similare, dar diferite de sortare de către un combinat coloană, după cum urmează.
var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))
utilizați următoarea linie de pe DataContext pentru a vă conecta la SQL activitate pe DataContext la consola - apoi, puteți vedea exact ceea ce linq declarații sunt solicitante din baza de date:
_db.Log = Console.Out
Următoarele declarații LINQ:
var movies = from row in _db.Movies
orderby row.CategoryID, row.Name
select row;
ȘI
var movies = _db.Movies.OrderBy(m => m.CategoryID).ThenBy(m => m.Name);
produce următoarele SQL:
SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].CategoryID, [t0].[Name]
Întrucât, repetarea unei OrderBy în Linq, pare a inversa rezultă SQL ieșire:
var movies = from row in _db.Movies
orderby row.CategoryID
orderby row.Name
select row;
ȘI
var movies = _db.Movies.OrderBy(m => m.CategoryID).OrderBy(m => m.Name);
produce următoarele SQL (Numele și CategoryId sunt comutate):
SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].[Name], [t0].CategoryID
Am creat unele metode de extensie (de mai jos), astfel încât să don't trebuie să vă faceți griji în cazul în care un IQueryable este deja ordonat sau nu. Dacă doriți să comandați prin mai multe proprietăți doar face după cum urmează:
// We do not have to care if the queryable is already sorted or not.
// The order of the Smart* calls defines the order priority
queryable.SmartOrderBy(i => i.Property1).SmartOrderByDescending(i => i.Property2);
Acest lucru este util mai ales dacă doriți să creați comanda dinamic, f.e. dintr-o listă de proprietăți la fel.
public static class IQueryableExtension
{
public static bool IsOrdered<T>(this IQueryable<T> queryable) {
if(queryable == null) {
throw new ArgumentNullException("queryable");
}
return queryable.Expression.Type == typeof(IOrderedQueryable<T>);
}
public static IQueryable<T> SmartOrderBy<T, TKey>(this IQueryable<T> queryable, Expression<Func<T, TKey>> keySelector) {
if(queryable.IsOrdered()) {
var orderedQuery = queryable as IOrderedQueryable<T>;
return orderedQuery.ThenBy(keySelector);
} else {
return queryable.OrderBy(keySelector);
}
}
public static IQueryable<T> SmartOrderByDescending<T, TKey>(this IQueryable<T> queryable, Expression<Func<T, TKey>> keySelector) {
if(queryable.IsOrdered()) {
var orderedQuery = queryable as IOrderedQueryable<T>;
return orderedQuery.ThenByDescending(keySelector);
} else {
return queryable.OrderByDescending(keySelector);
}
}
}
Există cel puțin o modalitate de a face acest lucru, folosind LINQ, deși nu cel mai usor.
O poti face cu ajutorul OrberBy()
metoda care folosește un IComparer. În primul rând aveți nevoie pentru a pună în aplicare un IComparer
pentru Film
clasa astfel:
public class MovieComparer : IComparer<Movie>
{
public int Compare(Movie x, Movie y)
{
if (x.CategoryId == y.CategoryId)
{
return x.Name.CompareTo(y.Name);
}
else
{
return x.CategoryId.CompareTo(y.CategoryId);
}
}
}
Apoi, puteți comanda filme cu următoarea sintaxă:
var movies = _db.Movies.OrderBy(item => item, new MovieComparer());
Dacă aveți nevoie pentru a comuta comanda a descrescător pentru unul dintre elementele de comuta doar pe x și y în interiorul Compara()
metoda de MovieComparer` în mod corespunzător.
Dacă utilizați generic depozit
> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();
altceva
> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();