具有通用Id的通用存储库 - 如何在int时检索

时间:2015-06-25 10:12:49

标签: c# .net entity-framework linq generics

我有一个通用存储库,它是我项目中所有存储库的基类。存储库具有对主键的通用支持,因此它不一定是int

我的初始实现就是这样,通过ID检索对象:

return Context.Set<TDomainObject>().Where(x => x.Id.Equals(id)).SingleOrDefaultAsync();

Id的类型为TPrimaryKey。当我尝试将此逻辑用于int时,我会收到一条带有消息的NotSupportedException

  

无法创建类型&#39; System.Object&#39;的常量值。在此上下文中仅支持原始类型或枚举类型。

所以我认为我是聪明的,TPrimaryKeyint的特殊情况,并按照这样的方式进行评估:

if (typeof(TPrimaryKey) == typeof(int))
{
    int iId = (int)(object)id;
    return Context.Set<TDomainObject>().Where(x => ((int)(object)x.Id) == iId).SingleOrDefaultAsync();
}

这产生了一个不同的例外:

  

无法转换类型&System; Int32&#39;键入&#39; System.Object&#39;。 LINQ to Entities仅支持转换EDM原语或枚举类型。

如何使用ints使我的通用存储库工作?

1 个答案:

答案 0 :(得分:2)

您可以使用Find方法

return Context.Set<TDomainObject>().Find(id);