ฉันจะปล่อยให้โค้ดพูดเพื่อตัวมันเอง:
public interface ISoftDeletable {
bool IsDeleted {get; set;}
}
public static class Extensions {
public IQueryable<T> Active<T>(this IQueryable<T> q) where T : ISoftDeletable {
return q.Where(t => !t.IsDeleted);
}
}
public partial class Thing : ISoftDeletable {
...
}
...
var query = from tc in db.ThingContainers
where tc.Things.Active().Any(t => t.SatisfiesOtherCondition)
select new { ... }; // throws System.NotSupportedException
ข้อผิดพลาดคือ:
LINQ to Entities ไม่รู้จักวิธีการ 'System.Collections.Generic.IQueryable`1[Thing] ActiveThing' และวิธีนี้ไม่สามารถแปลเป็นนิพจน์ของร้านค้าได้
คุณได้รับแนวคิด: ฉันต้องการวิธีแสดงออกอย่างคล่องแคล่วเพื่อที่ ISoftDeletable
ใดๆ ฉันสามารถเพิ่มส่วนคำสั่ง 'where' ด้วยโค้ดที่เรียบง่ายและสามารถนำมาใช้ซ้ำได้ ตัวอย่างที่นี่ใช้ไม่ได้เนื่องจาก Linq2Entities ไม่รู้ว่าต้องทำอย่างไรกับเมธอด Active()
ของฉัน
ตัวอย่างที่ฉันให้ไว้นี้เป็นตัวอย่างง่ายๆ แต่ในโค้ดจริงของฉัน ส่วนขยาย Active()
มีชุดเงื่อนไขที่ซับซ้อนกว่านี้มาก และฉันไม่ต้องการคัดลอกและวางเงื่อนไขนั้นไปทั่วโค้ดของฉัน
มีข้อเสนอแนะอะไรบ้าง?
Active
ในการเข้าร่วม - person Jon Skeet   schedule 29.08.2013Active
ซึ่งไม่เหมือนกับการเรียกActive
ด้วยตัวคุณเอง (เหมือนเมื่อก่อน) - person Jon Skeet   schedule 29.08.2013