C# 实体框架:使用通用函数在数据库中搜索?

C# 实体框架:使用通用函数在数据库中搜索?,c#,database,entity-framework-6,C#,Database,Entity Framework 6,我在数据库中有相当多的实体,它们都有一个列decimal DBSTATE,指示条目是活动的(1)还是不活动的(0)。为了快速获取实例,我创建了以下通用函数,该函数只返回实体的活动列: IEnumerable<DBType> GetActiveEntries<DBType>() where DBType : class, IDBEntry { return db.Set<DBType>().Where(e => e.DBStateInD

我在数据库中有相当多的实体,它们都有一个列decimal DBSTATE,指示条目是活动的(1)还是不活动的(0)。为了快速获取实例,我创建了以下通用函数,该函数只返回实体的活动列:

IEnumerable<DBType> GetActiveEntries<DBType>()
       where DBType : class, IDBEntry
{
   return db.Set<DBType>().Where(e => e.DBStateInDB == (decimal)DBState.Active).AsEnumerable();
}
实际上,这是不可能的,因为EF只能在查询中使用自己的类型,这就是为什么以下非泛型函数可以工作的原因:

IEnumerable<REGULARCUSTOMER> GetActives_TEMP()
{
   return db.REGULARCUSTOMERs.Where(e => e.DBSTATE == (decimal)DBState.Active).AsEnumerable();
}
IEnumerable GetActives_TEMP()
{
返回db.regularcusters.Where(e=>e.DBSTATE==(十进制)DBSTATE.Active.AsEnumerable();
}

所以我的问题是:是否有可能避免为所有实体编写单独的函数/切换案例,或者我真的坚持使用该选项?

我想你必须绕开这个问题

一种可能的方法是将
导航属性
(通过创建新的实体类型)添加到您的实体中,例如
DbSet
(例如),您的实体将具有定义
状态的
外键
,这将要求您有一个补充表,其中包含每个
实体的
ID
,以及其
状态的
bool
,使其干净且可访问。这也意味着,使用新创建的导航属性,您可以使用
您的\u ENTITY.EntityState.State
您的\u ENTITY.EntityState.Id
访问它,因为新表,您还可以修改/访问实体状态,而不管其类型如何。您的类型增强型规则仍将适用,并且更改表将更改实体,而不考虑类型

但同样,这只是一种方法。它应该是相对简单的实现,可以是相当强大的


让我知道你的想法

这似乎是一个相当琐碎的函数。你就不能把它扔掉吗?
db
是私有的还是向实现
GetActiveEntries
的类的用户公开的?为什么要引入一个新的notmapped属性进行查询?对于所有实体来说,它不是被称为
DBSTATE
?换句话说,为什么您的
GetActiveEntries()
IDBEntry
不使用名为
DBSTATE
的属性?@CodeCaster:是的,这是真的,但我不知道条目的确切类型(因此使用泛型),那么如何确保泛型参数DBType具有DBSTATE参数?我应该使用dynamic吗?您的接口
IDBEntry
显然有一个
decimal DBStateInDB{get;set;}
属性。将其重命名为
DBSTATE
,您就完成了。@CodeCaster:这不会使现有的DBSTATE模型类变得模棱两可吗?谢谢,但是CodeCaster的简单解决方案解决了我的问题:)@rTECH没问题,很好!;)祝你在这个项目上好运
IEnumerable<REGULARCUSTOMER> GetActives_TEMP()
{
   return db.REGULARCUSTOMERs.Where(e => e.DBSTATE == (decimal)DBState.Active).AsEnumerable();
}