multiple - order by 1 desc linq




Più "ordina per" in LINQ (5)

Ho due tabelle, movies e categories e ottengo una lista ordinata per categoryID prima e poi per Name .

La tabella del film ha tre colonne, ID, Nome e IDCategoria . La tabella delle categorie due ha colonne, ID e Nome .

Ho provato qualcosa di simile al seguente, ma non ha funzionato.

var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })

Aggiungere nuova":

var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })

Funziona sulla mia scatola. Ritorna qualcosa che può essere usato per ordinare. Restituisce un oggetto con due valori.

Simile, ma diverso per l'ordinamento da una colonna combinata, come segue.

var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))

C'è almeno un altro modo per farlo usando LINQ, sebbene non sia il più semplice. Puoi farlo usando il metodo OrberBy() che usa un OrberBy() . Per prima cosa devi implementare un IComparer per la classe Movie come questo:

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);
        }
    }
}

Quindi puoi ordinare i film con la seguente sintassi:

var movies = _db.Movies.OrderBy(item => item, new MovieComparer());

Se è necessario passare l'ordine alla discesa per uno degli elementi, basta cambiare di conseguenza la xey all'interno del metodo Compare() di MovieComparer .


Questo dovrebbe funzionare per te:

var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)

Se si utilizza un repository generico

> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();

altro

> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();

utilizzare la seguente riga sul DataContext per registrare l'attività SQL su DataContext sulla console, quindi è possibile visualizzare esattamente quali richieste del proprio linq richiedono dal database:

_db.Log = Console.Out

Le seguenti istruzioni LINQ:

var movies = from row in _db.Movies 
             orderby row.CategoryID, row.Name
             select row;

E

var movies = _db.Movies.OrderBy(m => m.CategoryID).ThenBy(m => m.Name);

produrre il seguente SQL:

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].CategoryID, [t0].[Name]

Considerando che, ripetendo un OrderBy in Linq, sembra invertire l'output SQL risultante:

var movies = from row in _db.Movies 
             orderby row.CategoryID
             orderby row.Name
             select row;

E

var movies = _db.Movies.OrderBy(m => m.CategoryID).OrderBy(m => m.Name);

produrre il seguente SQL (Nome e CategoryId sono commutati):

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].[Name], [t0].CategoryID






sql-order-by