通用方法和实体框架

时间:2015-09-17 14:59:22

标签: entity-framework entity-framework-6.1

我有一些特定于客户端的实体,因此我经常想要获取适用于特定客户端的实体集。如下所示:

interface IClientSpecific
  int ClientId {get;}

class Entity1 : IClientSpecific
{
 ...
}

class Entity2: IClientSpecific
{
 ...
}

class MyContext : DbContext
{
  DbSet<Entity1> Entity1s {get; set;}
  DbSet<Entity2> Entity2s {get; set;}
}

替换大量的重复代码,例如

GetEntity1s(int clientId)
{
  Entity1s.Where(e => e.ClientId);
}

我尝试添加扩展方法:

IQueryable<T> GetForClient<T>(this IQueryable<T> items, int clientId)
  where T : IClientSpecific
{
  return items.Where(i => i.ClientId = clientId);
}

这失败了:

  

“System.NotSupportedException”类型的第一次机会异常   发生在EntityFramework.SqlServer.dll

中      

其他信息:无法将“Entity1”类型强制转换为类型   'IClientSpecific'。 LINQ to Entities仅支持转换EDM   原始或枚举类型。

如何在多种实体类型上重用逻辑?

1 个答案:

答案 0 :(得分:2)

class泛型类型约束添加到扩展方法,它可能会解决问题。它对我有用。

IQueryable<T> GetForClient<T>(this IQueryable<T> items, int clientId)
 where T : **class**, IClientSpecific
{
  return items.Where(i => i.ClientId = clientId);
}