Tôi có phương pháp mở rộng chung sau:
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;
}
Thật không may, Entity Framework không biết cách xử lý predicate
vì C # đã chuyển đổi vị từ thành như sau:
e => ((IEntity)e).Id == id
Entity Framework ném ngoại lệ sau:
Không thể truyền kiểu 'IEntity' thành kiểu 'SomeEntity'. LINQ to Entities chỉ hỗ trợ truyền kiểu nguyên thủy hoặc kiểu liệt kê EDM.
Làm thế nào chúng tôi có thể làm cho Entity Framework hoạt động với IEntity
giao diện của chúng tôi ?