Saya menggunakan LINQ pada IQuerable yang dikembalikan dari NHibernate dan saya perlu memilih baris dengan nilai maksimum di beberapa bidang.
Saya telah menyederhanakan sedikit yang saya pertahankan. Saya perlu memilih satu baris dari tabel saya dengan nilai maksimum dalam satu bidang.
var table = new Table { new Row(id: 1, status: 10), new Row(id: 2, status: 20) }
from u in table
group u by 1 into g
where u.Status == g.Max(u => u.Status)
select u
Ini tidak benar, tetapi saya tidak dapat menentukan bentuk yang benar.
BTW, apa yang sebenarnya saya coba capai adalah kira-kira ini:
var clientAddress = this.repository.GetAll()
.GroupBy(a => a)
.SelectMany(
g =>
g.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.AddressReference == g.Max(x => x.AddressReference) &&
a.StartDate == g.Max(x => x.StartDate)))
.SingleOrDefault();
Saya mulai dengan lambda di atas tetapi saya telah menggunakan LINQPad untuk mencoba dan mengerjakan sintaks untuk memilih Max ().
MEMPERBARUI
Menghapus GroupBy adalah kuncinya.
var all = this.repository.GetAll();
var address = all
.Where(
a =>
a.Reference == clientReference &&
a.Status == ClientStatus.Live &&
a.StartDate == all.Max(x => x.StartDate) &&
a.AddressReference == all.Max(x => x.AddressReference))
.SingleOrDefault();
Jawaban:
Saya tidak mengerti mengapa Anda berkelompok di sini.
Coba ini:
Pendekatan alternatif yang
table
hanya akan berulang sekali adalah ini:Hal ini berguna jika
table
adalahIEnumerable<T>
yang tidak hadir dalam memori atau yang dihitung dengan cepat.sumber
from u in User_Accounts where u.Status == User_Accounts.Max(y => y.Status) select u
table.First(x => x.Status == table.Max(x => x.Status))
table
.Anda juga bisa melakukan:
sumber
Anda dapat mengelompokkan berdasarkan status dan memilih baris dari grup terbesar:
Yang pertama
First()
mendapatkan grup pertama (kumpulan baris dengan status terbesar); yang keduaFirst()
mendapat baris pertama dalam grup itu.Jika status selalu unqiue, Anda bisa mengganti second
First()
denganSingle()
.sumber
Mengatasi pertanyaan pertama, jika Anda perlu mengambil beberapa baris yang dikelompokkan berdasarkan kriteria tertentu dengan kolom lain dengan nilai maksimal Anda dapat melakukan sesuatu seperti ini:
sumber
Lebih dari satu contoh:
Mengikuti:
Sama dengan:
sumber
Cukup dalam satu baris:
Perhatikan bahwa ada dua tindakan. tindakan bagian dalam untuk mencari nilai maksimal, tindakan bagian luar untuk mendapatkan objek yang diinginkan.
sumber