ฉันรู้ว่านี่เป็นคำถามเก่าและคำตอบที่ได้รับการยอมรับ แต่คำถามนี้ตอบคำถามของฉันเกี่ยวกับว่าชุดว่างดังกล่าวจะส่งผลให้เกิดข้อยกเว้นหรือdefault(int)
ผล
อย่างไรก็ตามคำตอบที่ได้รับการยอมรับในขณะที่ใช้งานได้นั้นไม่ใช่วิธีที่สมบูรณ์แบบสำหรับ IMHO ซึ่งไม่ได้ให้ที่นี่ ดังนั้นฉันจะให้มันในคำตอบของฉันเองเพื่อประโยชน์ของทุกคนที่กำลังมองหามัน
รหัสดั้งเดิมของ OP คือ:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);
นี่คือวิธีที่ฉันจะเขียนเพื่อป้องกันข้อยกเว้นและให้ผลลัพธ์เริ่มต้น:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;
นี่เป็นสาเหตุชนิดกลับของMax
ฟังก์ชั่นที่จะเป็นint?
ซึ่งจะช่วยให้null
ผลแล้ว??
แทนที่ผลกับ null
0
แก้ไข
เพื่อชี้แจงบางสิ่งจากความคิดเห็น Entity Framework ไม่สนับสนุนas
คำหลักในปัจจุบันดังนั้นวิธีเขียนเมื่อทำงานกับ EF จะเป็น:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;
เนื่องจาก[TypeOfWorkers]
อาจเป็นชื่อชั้นยาวและน่าเบื่อในการเขียนฉันจึงได้เพิ่มวิธีการขยายเพื่อช่วยออก
public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
return source.Max(selector) ?? nullValue;
}
นี้จะจับint
แต่เดียวกันสามารถทำได้สำหรับlong
, double
หรือประเภทค่าอื่น ๆ ที่คุณจำเป็นต้อง การใช้วิธีการขยายนี้เป็นเรื่องง่ายมากคุณเพียงแค่ส่งผ่านฟังก์ชั่นตัวเลือกของคุณและเลือกที่จะรวมค่าที่จะใช้เป็นค่าว่างซึ่งเริ่มต้นที่ 0 ดังนั้นด้านบนสามารถเขียนใหม่ได้เช่น:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);
หวังว่าจะช่วยให้ผู้คนออกไปมากยิ่งขึ้น