งานของผมใช้ Dapper แล้วปัญหามันมีอยู่ว่าตอนสร้าง predicate(เงื่อนไข) มันต้องเอาชื่อ Property ไป Where ทำให้มันมีความเสี่ยงมาก ถ้าแก้ชื่อ Property แล้ว Refactor ไม่ครบครับ ผมเลยทำ Helper มาเพื่อช่วยให้มันไป Get ชื่อ Property จากตัว Object ซะเลยครับ ได้มาเป็น
Update 2019-05-23
จากแบบที่สอง เราสามารถใช้ nameof ได้เลยครับ ตัวอย่าง ตามนี้เลย แถม Code สั้นกระชับด้วย
IDictionary<string, object> criteria = new Dictionary<string, object>(); criteria.Add(nameof(InterestRateDTO.ActiveFlag),ACTIVE_FLAG.ACTIVE.ToString()); criteria.Add(nameof(InterestRateDTO.InterestRateId),IntRateConditionList); IList InterestRateList = _InterestRateDAO.FetchList(criteria); IList InterestRateDetailList = _InterestRateDetailDAO.FetchList(criteria);
สำหรับถ้าใครอยากอ่าน Step การ Research ของผม ตามนี้เลยครับ
แบบที่ 1: Get Property with create an instance
//Get Property with create an instance public static string GetPropertyName(Expression<Func> expression) { MemberExpression body = (MemberExpression)expression.Body; return body.Member.Name; }
- ตัวอย่างการใช้งานครับ
IDictionary<String, Object> criteria = new Dictionary<String, Object>(); InterestRateDTO InterestRate = new InterestRateDTO(); criteria.Add(TypeExtensions.GetPropertyName(() => InterestRate.ActiveFlag), ACTIVE_FLAG.ACTIVE.ToString()); criteria.Add(TypeExtensions.GetPropertyName(() => InterestRate.InterestRateId), IntRateConditionList); IList InterestRateList = _InterestRateDAO.FetchList(criteria); IList InterestRateDetailList = _InterestRateDetailDAO.FetchList(criteria);
Trade-off: ปัญหาของแบบแรก คือ ต้องมีการ new Object ขึ้นมาครับ เสีย Cost มาแก้เป็นแบบที่สองดีกว่า
แบบที่ 2: Get Property without create an instance
//Get Property without create an instance public static string GetPropertyName<TModel, TProperty>(Expression<Func<TModel, TProperty>> property) { MemberExpression memberExpression = (MemberExpression)property.Body; return memberExpression.Member.Name; }
- ตัวอย่างการใช้งานครับ
IDictionary<string, object> criteria = new Dictionary<string, object>(); criteria.Add(TypeExtensions.GetPropertyName((InterestRateDTO c) => c.ActiveFlag),ACTIVE_FLAG.ACTIVE.ToString()); criteria.Add(TypeExtensions.GetPropertyName((InterestRateDTO c) => c.InterestRateId),IntRateConditionList); IList InterestRateList = _InterestRateDAO.FetchList(criteria); IList InterestRateDetailList = _InterestRateDetailDAO.FetchList(criteria);
จบไปแล้วกับ Blog ในสาย Coding ที่ทิ้งห่างไปนานพอสมควร หลังจากที่เริ่มเรียน ป โท ครับ
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.