ฉันมีวิธีการขยายทั่วไปดังต่อไปนี้:
public static T GetById<T>(this IQueryable<T> collection, Guid id)
where T : IEntity
{
Expression<Func<T, bool>> predicate = e => e.Id == id;
T entity;
// Allow reporting more descriptive error messages.
try
{
entity = collection.SingleOrDefault(predicate);
}
catch (Exception ex)
{
throw new InvalidOperationException(string.Format(
"There was an error retrieving an {0} with id {1}. {2}",
typeof(T).Name, id, ex.Message), ex);
}
if (entity == null)
{
throw new KeyNotFoundException(string.Format(
"{0} with id {1} was not found.",
typeof(T).Name, id));
}
return entity;
}
น่าเสียดายที่ Entity Framework ไม่ทราบวิธีจัดการกับไฟล์ predicate
เนื่องจาก C # แปลงเพรดิเคตเป็นดังต่อไปนี้:
e => ((IEntity)e).Id == id
Entity Framework แสดงข้อยกเว้นต่อไปนี้:
ไม่สามารถแคสต์ประเภท 'IEntity' เพื่อพิมพ์ 'SomeEntity' ได้ LINQ to Entities รองรับเฉพาะการหล่อ EDM แบบดั้งเดิมหรือประเภทการแจงนับ
เราจะทำให้ Entity Framework ทำงานร่วมกับIEntity
อินเทอร์เฟซของเราได้อย่างไร?