本文介绍了LINQ to Entities 仅支持使用 IEntity 接口转换 EDM 原语或枚举类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下通用扩展方法:
I have the following generic extension method:
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# 将谓词转换为以下内容:
Unfortunately Entity Framework doesn't know how to handle the predicate
since C# converted the predicate to the following:
e => ((IEntity)e).Id == id
Entity Framework 抛出以下异常:
Entity Framework throws the following exception:
无法将类型IEntity"转换为类型SomeEntity".LINQ到实体仅支持转换 EDM 原语或枚举类型.
我们如何让实体框架与我们的 IEntity
接口一起工作?
How can we make Entity Framework work with our IEntity
interface?
推荐答案
我能够通过向扩展方法添加 class
泛型类型约束来解决这个问题.不过,我不确定它为什么有效.
I was able to resolve this by adding the class
generic type constraint to the extension method. I'm not sure why it works, though.
public static T GetById<T>(this IQueryable<T> collection, Guid id)
where T : class, IEntity
{
//...
}
这篇关于LINQ to Entities 仅支持使用 IEntity 接口转换 EDM 原语或枚举类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!