我有一些特定于客户端的实体,因此我经常想要获取适用于特定客户端的实体集。如下所示:
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 原始或枚举类型。
如何在多种实体类型上重用逻辑?
答案 0 :(得分:2)
将class
泛型类型约束添加到扩展方法,它可能会解决问题。它对我有用。
IQueryable<T> GetForClient<T>(this IQueryable<T> items, int clientId)
where T : **class**, IClientSpecific
{
return items.Where(i => i.ClientId = clientId);
}