Asp.net mvc 在我的例子中使用扩展方法正确吗?

Asp.net mvc 在我的例子中使用扩展方法正确吗?,asp.net-mvc,entity-framework,extension-methods,Asp.net Mvc,Entity Framework,Extension Methods,我在项目中使用MVC4和EntityFramework5,我有很多表。作为我们项目的一个规则,我们不从数据库中删除任何记录,每个记录都有一个ISAcfield字段,如果该字段是false,那么我们认为它被删除了。我想写一个扩展方法来获取活动记录,在谷歌搜索之后,我写了以下内容: public static IQueryable<Company> GetAll(this IQueryable<Company> source) { return source.Where

我在项目中使用MVC4和EntityFramework5,我有很多表。作为我们项目的一个规则,我们不从数据库中删除任何记录,每个记录都有一个ISAcfield字段,如果该字段是false,那么我们认为它被删除了。我想写一个扩展方法来获取活动记录,在谷歌搜索之后,我写了以下内容:

public static IQueryable<Company> GetAll(this IQueryable<Company> source)
{
   return source.Where(p => p.isActive);
}
但假设我的数据库中有50多个表,为每个表编写相同的扩展方法是否是一种好方法。有没有更好的方法可以为所有表编写一个GetAll()扩展方法?实际上,我甚至不确定对这个实例使用扩展方法是否正确


谁能帮帮我,给我指路吗?如果您能提供代码示例,我将不胜感激。

这取决于您如何使用实体框架,如果您依赖于普通生成器(我认为您是这样),您的案例将变得更加困难,我从未进行过类似的案例研究。但是,如果您使用普通的POCO类生成器,您可以使用一个基类,我们称之为
CEntity
,它是其他每个类(表)的基类

我们到了吗?不,要继续,我更喜欢使用存储库模式,您可以将该存储库设置为通用(CEntity),例如:

public class Repository<CEntity> where CEntity : class
{
    public IQueryable<CEntity> GetAll()
    {
       return source.Where(p => p.isActive);
    }

}
公共类存储库,其中CEntity:class
{
公共IQueryable GetAll()
{
返回source.Where(p=>p.isActive);
}
}
这就是如何使用它:

Repository<Company> com = new Repository<Company>();
Repository<Employee> emp = new Repository<Employee>();

var coms = com.GetAll();    // will get all ACTIVE companies
var emps = emp.GetAll();    // will get all ACTIVE employees
Repository com=newrepository();
Repository emp=新存储库();
var coms=com.GetAll();//将得到所有活跃的公司
var emps=emp.GetAll();//将得到所有积极的员工

这是我的想法,如果您有任何其他问题,请将其作为评论,很乐意提供帮助。

有趣的是,这正是我实现数据层的方式,我认为它非常棒:)

我也在中间插入了一个存储库,但是一般的概念应该使用或不使用。 下面是一些工作代码示例,说明了我如何在博客中为一些类似的用例使用此方法


我发现它可以生成一些非常优雅的代码,但仍然不会限制您可以做的事情。正如我所说,我认为这种方法非常棒,并推荐使用。

感谢您的快速回答。我使用数据库优先的方法。EF5.x DbContextGenerator是普通的POCO类生成器吗?如果没有,在哪里可以找到正常的POCO类生成器?顺便说一下,在您的示例中,“源”没有定义。我知道,
source
只是对象集,它是对象的集合。但是我们怎么说它有一个活动字段呢?编译器给出了一个类似“没有这样的字段”的错误?我想我必须转换到Company类,但没有什么会改变,然后我必须对我的所有表执行转换??然后你必须使用泛型(匿名类型)和反射从对象中获取字段“isActive”值。感谢Luke的示例项目。有一件事我不明白(可能更多)。是为每个存储库创建数据库上下文类,还是存储库共享一个数据库上下文类(只创建一个上下文)?是的,我想我的示例在使用通用存储库时稍微复杂一些。下面有一个DbContext(),但是如果通过扩展iquerable或IDbSet对您更有效,那么您实际上可以在不使用存储库的情况下执行相同的扩展方法。
Repository<Company> com = new Repository<Company>();
Repository<Employee> emp = new Repository<Employee>();

var coms = com.GetAll();    // will get all ACTIVE companies
var emps = emp.GetAll();    // will get all ACTIVE employees