Bagaimana cara mengelompokkan IQueryable berdasarkan properti 1 tetapi memesan berdasarkan properti 2?

Mengikuti pertanyaan saya sebelumnya di sini

saya menggunakan

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy((License => License.dateCreated)).OrderByDescending(lics => lics.Key).First();

Untuk mengelompokkan IQueryable

allEvaluationLicenses 

dengan menggunakan properti Lisensi 1 yaitu 'dateCreated'

Namun sekarang, bagaimana cara memesannya dengan menggunakan properti lain seperti 'nLicenceID'?

Apakah mungkin melakukan hal seperti ini:

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy((License => License.dateCreated)).OrderByDescending(lics => (sort by nLicenseID here) ).First();

person Mikk    schedule 29.04.2013    source sumber
comment
Apakah Anda ingin mengurutkan semua grup, jika demikian, bagaimana jika item dalam grup tidak semuanya memiliki nLicenseID yang sama, apa yang Anda lakukan? Atau maksud Anda mengurutkan berdasarkan nilai tersebut dalam setiap grup?   -  person Servy    schedule 29.04.2013
comment
Apa yang menghentikan Anda melakukan lics.Id di lambda pesanan?   -  person Mohammed Hossain    schedule 29.04.2013
comment
bagaimana jika item dalam grup tidak semuanya memiliki nLicenseID yang sama -- Ya, saya mengetahui hal ini, saya hanya ingin mengetahui ini -› maksud Anda mengurutkan berdasarkan nilai tersebut dalam setiap grup?   -  person Mikk    schedule 29.04.2013


Jawaban (2)


Untuk LINQ-to-Objects, objek di dalam setiap grup mempertahankan urutan penemuannya:

Objek IGrouping<TKey, TElement> dihasilkan dalam urutan berdasarkan urutan elemen dalam sumber yang menghasilkan kunci pertama dari setiap IGrouping<TKey, TElement>. Elemen dalam pengelompokan dihasilkan sesuai urutan kemunculannya di sumber.

Jadi: jika tujuan Anda adalah mengurutkan konten setiap grup, cukup urutkan sumbernya:

var distinctAllEvaluationLicenses = allEvaluationLicenses
    .OrderByDescending({whatever})
    .GroupBy({etc}).First(); 

Perhatikan bahwa ini tidak dijamin berfungsi untuk sumber LINQ lainnya, dan perhatikan bahwa ini tidak mempengaruhi urutan penyajian grup. Untuk melakukan itu, Anda mungkin dapat melakukan sesuatu seperti:

var distinctAllEvaluationLicenses = allEvaluationLicenses
    .GroupBy({etc}).
    .OrderBy(grp => grp.Min(item => x.SomeProp)).First(); 

yang akan menampilkan grup dalam urutan minimum SomeProp di masing-masing grup. Tentunya sesuaikan dengan max /etc seperlunya.

person Marc Gravell    schedule 29.04.2013
comment
Dia secara khusus mengatakan ini adalah IQueryable, jadi ini bukan terkait dengan objek. Ini linq ke sql (berdasarkan pertanyaan sebelumnya) - person Servy; 29.04.2013
comment
@Servy IQueryable tidak memberi tahu kami apa pun tentang sumbernya. LINQ-to-Objects dapat diekspos sebagai IQueryable. Anehnya, melalui .AsQueryable. Sekarang, pertanyaan sebelumnya sedikit - tidak apa-apa, tapi saya menjawab pertanyaan ini, bukan pertanyaan sebelumnya. - person Marc Gravell; 29.04.2013
comment
Seperti yang saya katakan, sesuai pertanyaan sebelumnya oleh pengguna ini tentang masalah ini, ini linq ke sql, bukan linq ke objek. Bahkan jika Anda tidak mengetahuinya, jawabannya (idealnya) harus berlaku untuk penyedia kueri mana pun jika tidak ada yang ditentukan, bukan hanya satu penyedia kueri tertentu (dan agak tidak mungkin). - person Servy; 29.04.2013

Untuk mengurutkan item dalam grup Anda dapat menggunakan Select:

var distinctAllEvaluationLicenses = allEvaluationLicenses.GroupBy(License => License.dateCreated)
    .Select(group => group.OrderByDescending(item => item.nLicenceID));
person Servy    schedule 29.04.2013