实体框架,其中Deleted = 0

时间:2011-09-01 18:50:49

标签: c# entity-framework

我需要为每个SQL查询添加这个简单的语句:

  

WHERE Deleted = 0

有什么简单的方法吗?我的意思是我需要过滤所有记录,最好是在edmx文件中。

3 个答案:

答案 0 :(得分:5)

听起来您希望默认情况下向对象集添加WHERE。我不知道你是否可以默认这样做,但我能想到的几个方法是:

1)使用视图为您提供WHERE子句并从视图中构建实体。我从来没有真正做到这一点,所以我不知道视图与EF的效果如何 - 如果你需要回写数据库,这可能不会很好。

2)在EDMX的部分类中创建新属性,例如:

partial class MyEntities
{
    public IQueryable<Foo> ActiveFoos
    {
        return Foos.Where(f => f.Deleted == 0);
    }
}
...
using (var context = new MyEntities())
{
    var foo = context.ActiveFoos.Where(f => f.Id == 1).SingleOrDefault();
}

3)创建一个子上下文类和new的属性 - 有点难看,但是一旦它被构建,这对开发人员来说是相当透明的。

public class CustomEntities : MyEntities
{
    public new IQueryable<Foo> Foos
    {
        get { return base.Foos.Where(f => f.Deleted == 0); }
    }
}
...
using (var context = new CustomEntities())
{
    var foo = context.Foos.Where(f => f.Id == 1).SingleOrDefault();
}

答案 1 :(得分:2)

确保始终使用Deleted = 0(包括延迟加载,显式加载和预先加载)的唯一可靠方法是使用Conditional mapping。条件映射的缺点是Deleted列在entity = Delete操作中不可用,该操作设置此列必须映射到存储过程。

答案 2 :(得分:0)

您必须在从EntityFramework获得结果时执行此操作。

示例:

IEnumerable<TableEntity> filteredResults = TableEntityName.Where(t => t.Delete = 0);