Pertanyaan Beberapa "pesanan oleh" di LINQ


Saya punya dua meja, movies dan categories, dan saya mendapat daftar pesanan dengan categoryID pertama dan kemudian oleh Nama.

Tabel film memiliki tiga kolom, ID, Nama, dan CategoryID. Tabel kategori dua memiliki kolom, ID, dan Nama.

Saya mencoba sesuatu seperti berikut, tetapi tidak berhasil.

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

1380
2017-11-18 13:34


asal


Jawaban:


Ini seharusnya bekerja untuk Anda:

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

2524
2017-11-18 13:41



Menggunakan non-lambda, LINQ kueri-sintaks, Anda dapat melakukan ini:

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

[EDIT to address comment] Untuk mengontrol urutan pengurutan, gunakan kata kunci ascending (yang merupakan default dan karena itu tidak terlalu berguna) atau descending, seperti:

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

550
2017-09-30 14:49



Tambah baru":

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

Itu berfungsi di kotak saya. Itu mengembalikan sesuatu yang dapat digunakan untuk mengurutkan. Ia mengembalikan objek dengan dua nilai.

Serupa, tetapi berbeda untuk menyortir oleh kolom gabungan, sebagai berikut.

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

67
2018-06-22 14:27



gunakan baris berikut pada DataContext Anda untuk mencatat aktivitas SQL pada DataContext ke konsol - kemudian Anda dapat melihat dengan tepat apa yang diminta oleh pernyataan linq Anda dari database:

_db.Log = Console.Out

Pernyataan LINQ berikut:

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

DAN

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

menghasilkan SQL berikut:

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

Sedangkan, mengulangi OrderBy di Linq, muncul untuk membalikkan hasil SQL yang dihasilkan:

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

DAN

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

menghasilkan SQL berikut (Nama dan CategoryId diaktifkan):

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

18
2018-02-18 21:03



Setidaknya ada satu cara lagi untuk melakukan ini menggunakan LINQ, meskipun bukan yang paling mudah. Anda dapat melakukannya dengan menggunakan OrberBy() metode yang menggunakan IComparer. Pertama Anda perlu terapkan IComparer Untuk Movie kelas seperti ini:

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

Kemudian Anda dapat memesan film dengan sintaks berikut:

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

Jika Anda perlu mengganti urutan ke descending untuk salah satu item, cukup ubah x dan y di dalam Compare()  metode dari MovieComparer demikian.


12
2018-04-03 14:07



Saya telah membuat beberapa metode perluasan (di bawah) sehingga Anda tidak perlu khawatir jika IQueryable sudah dipesan atau tidak. Jika Anda ingin memesan dengan beberapa properti, lakukan saja sebagai berikut:

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

Ini sangat membantu jika Anda membuat pemesanan secara dinamis, f.e. dari daftar properti untuk disortir.

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

11
2018-06-08 14:49



Jika menggunakan repositori generik

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

lain

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

0
2017-07-17 14:29