Saya punya dua tabel, bioskop
dan kategori
, dan saya mendapatkan daftar memerintahkan dengan categoryID pertama dan kemudian oleh ****Nama.
Film memiliki tiga kolom ID, Nama dan CategoryID. Kategori meja yang memiliki dua kolom ID dan Nama.
Saya mencoba sesuatu seperti berikut, tetapi tidak't bekerja.
var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })
Menggunakan non-lambda, query-syntax LINQ, anda dapat melakukan ini:
var movies = from row in _db.Movies
orderby row.Category, row.Name
select row;
[EDIT untuk mengatasi komentar] Untuk mengontrol urutan, gunakan kata kunci naik
(yang merupakan default dan oleh karena itu tidak terlalu berguna) atau turun
, seperti:
var movies = from row in _db.Movies
orderby row.Category descending, row.Name
select row;
Tambahkan "baru":
var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })
Yang bekerja pada kotak saya. Itu tidak kembali sesuatu yang dapat digunakan untuk mengurutkan. Ia mengembalikan sebuah objek dengan dua nilai.
Mirip, tapi berbeda dengan menyortir oleh gabungan kolom, sebagai berikut.
var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))
gunakan baris berikut pada DataContext untuk login SQL aktivitas di DataContext untuk konsol maka anda dapat melihat persis apa yang anda pernyataan linq meminta dari database:
_db.Log = Console.Out
Berikut pernyataan LINQ:
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 SQL yang dihasilkan output:
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
Saya telah menciptakan beberapa metode ekstensi (di bawah ini) sehingga anda don't perlu khawatir jika IQueryable sudah memerintahkan atau tidak. Jika anda ingin memesan dengan beberapa sifat yang hanya melakukannya 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);
Hal ini sangat membantu jika anda membuat pemesanan secara dinamis, f.e. dari daftar properti untuk mengurutkan.
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);
}
}
}
Setidaknya ada satu lagi cara untuk melakukan ini dengan menggunakan LINQ, meskipun tidak mudah.
Anda dapat melakukannya dengan menggunakan OrberBy()
metode yang menggunakan sebuah IComparer
. Pertama, anda perlu untuk
menerapkan IComparer
untuk Film
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 untuk beralih pemesanan untuk turun untuk salah satu item hanya beralih x dan y dalam Membandingkan()
metode MovieComparer
yang sesuai.
Jika menggunakan generic repository
> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();
lain
> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();