Katakanlah saya memiliki model sepak bola Team
. Ia memainkan Matches
dalam grup dengan tim lain. Sekarang saya ingin memilih 2 tim teratas dari daftar. Skor dihitung seperti biasa: 3 menang, 1 seri, 0 kalah.
Model untuk Match
terlihat seperti ini:
[Key]
public int MatchId{get;set;}
public int HomeTeamId { get; set; }
public int AwayTeamId { get; set; }
[ForeignKey("HomeTeamId")]
public virtual Team HomeTeam { get; set; }
[ForeignKey("AwayTeamId")]
public virtual Team AwayTeam { get; set; }
public int? HomeTeamScored { get; set; }
public int? AwayTeamScored { get; set; }
Saya telah menguji 5 solusi ini:
1) memiliki tampilan alih-alih tabel untuk mengambil kolom skor, tetapi ini mempersulit bagian pemrograman karena saya harus memberitahu EF untuk menggunakan tabel untuk penyisipan tetapi tampilan untuk menampilkan data
2) Biarkan kolom Score
tidak dipetakan, lalu ambil semua tim, hitung skornya seperti ini:
var list = db.Teams.ToList();
foreach(var team in list)
{
team.Score = db.Matches.Where(...).Sum();
}
lalu pesan saja daftarnya paling lambat Score
dan ambil 2 yang pertama.
3) Cara lainnya adalah dengan memiliki
var list = db.Teams.OrderByDesc(t => db.Matches.Where(...).Sum()).Take(2).ToList();
Saya harus melakukan banyak pengecekan untuk null, juga memeriksa tim mana yang menang atau seri, apakah tim yang saya cari bermain sebagai kandang atau tandang, dll.
4) Pilihan lainnya adalah menghitung ulang Score
untuk tim setiap kali saya menambahkan/mengedit pertandingan, namun menurut saya ini adalah pendekatan yang sangat tidak profesional.
Seperti yang saya katakan, masing-masing metode ini adalah solusi yang akan mengarahkan saya untuk menyelesaikan tugas, tapi... Saya memiliki indra keenam bahwa saya kehilangan sesuatu yang sangat jelas tentang bagaimana saya dapat menyelesaikannya dengan sedikit usaha. Adakah yang bisa menyarankan apa yang saya lewatkan?
P.S. Jika itu memengaruhi jawabannya, anggap saja saya menggunakan semuanya versi terbaru.