เอาเป็นว่าผมมีโมเดลฟุตบอล Team
มันเล่น Matches
ในกลุ่มกับทีมอื่น ตอนนี้ผมขอคัดทีม 2 อันดับแรกจากรายการ คะแนนจะถูกนับตามปกติ: ชนะ 3, เสมอ 1, แพ้ 0
โมเดลสำหรับ Match
มีลักษณะดังนี้:
[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; }
ฉันได้ทดสอบวิธีแก้ปัญหา 5 ข้อนี้แล้ว:
1) มีมุมมองแทนตารางเพื่อใช้คอลัมน์คะแนน แต่มันทำให้ส่วนการเขียนโปรแกรมซับซ้อนขึ้น เนื่องจากฉันจะต้องบอก EF ให้ใช้ตารางในการแทรก แต่มุมมองสำหรับการแสดงข้อมูล
2) ให้คอลัมน์ Score
ไม่ถูกแมป จากนั้นนำทุกทีม นับคะแนนดังนี้:
var list = db.Teams.ToList();
foreach(var team in list)
{
team.Score = db.Matches.Where(...).Sum();
}
จากนั้นเพียงเรียงลำดับรายการภายใน Score
และเอา 2 ตัวแรก
3) อีกวิธีหนึ่งคือการมี
var list = db.Teams.OrderByDesc(t => db.Matches.Where(...).Sum()).Take(2).ToList();
ผมจะต้องทำการตรวจสอบหาค่าว่างมากมาย รวมถึงเช็คด้วยว่าทีมไหนชนะหรือเสมอ ไม่ว่าทีมที่ผมมองหาจะเล่นเป็นเหย้าหรือเยือน เป็นต้น
4) อีกทางเลือกหนึ่งคือการนับ Score
ของทีมทุกครั้งที่ฉันเพิ่ม/แก้ไขการแข่งขัน แต่ฉันรู้สึกว่านี่เป็นแนวทางที่ไม่เป็นมืออาชีพมาก
ดังที่ฉันได้กล่าวไว้ แต่ละวิธีการเหล่านี้เป็นวิธีแก้ปัญหาที่จะนำฉันไปสู่การแก้ปัญหา แต่... ฉันรู้สึกได้ถึงความรู้สึกที่หกว่าฉันพลาดบางสิ่งบางอย่างที่ชัดเจนโดยสิ้นเชิงว่าฉันจะทำสิ่งนี้โดยใช้ความพยายามน้อยที่สุดได้อย่างไร ใครสามารถแนะนำสิ่งที่ฉันหายไป?
ป.ล. ถ้ามันส่งผลต่อคำตอบ สมมติว่าฉันใช้ทุกอย่างเป็นเวอร์ชันล่าสุด