如何在Entity Framework中的DbSet属性上设置过滤器选项?

时间:2017-09-06 11:51:25

标签: c# asp.net-mvc entity-framework

我的上下文类中有DbSet属性,如下所示:

public class ProjectContext: DbContext
{
    public ProjectContext(): base("name=DBCS")
    {
    }

    public DbSet<Employee> EmployeeDbSet { get; set; }
}

此属性正在我的项目的许多地方使用。现在我需要在Employee上设置一个通用条件,例如我只需要活跃的员工。我可以通过简单地过滤我的linq查询来获得活跃的员工:

var employees = context.EmployeeDbSet.where(e => e.IsActive).ToList();

由于我已经在我的项目的许多地方编写过很多查询,现在我必须重写所有这些查询非常困难,耗时且容易出错。

由于这是一个通用条件,我想在所有查询上设置此项,我正在寻找一种方法来设置EmployeeDbSet属性的条件。

可以完成吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以向DbContext添加public IQueryable<Employee> ActiveEmployees { get { return EmployeeDbSet.Where(e => e.IsActive); } } 属性,该属性返回活动where条件设置。

实施例

context.ActiveEmployees.Where(x=> x.name == "john");

通过这种方式,您可以将其与其他条件相结合;

DbSet<T>

执行此操作后,您无法使用直接在public static class DbModelExtensions { public static Employee Find(this IQueryable<Employee> query, int id) { return query.Where(x => x.Id == id).FirstOrDefault(); } } 中声明的方法。要在使用where之后使用find方法,您可以自己添加一个新的find方法,如下所示;

Find

如果在当前文件中引用其名称空间,则会将扩展方法IQueryable<Employee>添加到context.ActiveEmployees.Find(15);

然后你可以像这样使用它;

Modify predictions.select("label", "features").show(5);