J'ai la méthode d'extension générique suivante :
public static T GetById(this IQueryable collection, Guid id)
where T : IEntity
{
Expression> predicate = e => e.Id == id;
T entity;
// Permettre de rapporter des messages d'erreur plus descriptifs.
try
{
entity = collection.SingleOrDefault(predicate);
}
catch (Exception ex)
{
throw new InvalidOperationException(string.Format(
"Une erreur s'est produite lors de la récupération d'un {0} avec l'identifiant {1}. {2}",
typeof(T).Name, id, ex.Message), ex);
}
if (entity == null)
{
throw new KeyNotFoundException(string.Format(
"{0} avec l'identifiant {1} n'a pas été trouvé.",
typeof(T).Name, id));
}
return entity;
}
Malheureusement, Entity Framework ne sait pas comment gérer le predicate
puisque C# a converti le prédicat en :
e => ((IEntity)e).Id == id
Entity Framework lance l'exception suivante :
Impossible de convertir le type 'IEntity' en type 'SomeEntity'. LINQ to Entities ne prend en charge que la conversion de types EDM primitifs ou énumérés.
Comment pouvons-nous faire en sorte que Entity Framework fonctionne avec notre interface IEntity
?