告诉EF不要考虑位字段= 1的记录(isDeleted)

时间:2011-02-23 08:35:23

标签: entity-framework entity-framework-4 ef-code-first

所有表都有一个位字段IsDeleted

有没有办法告诉EF在进行查询时不要考虑它们。

或者我必须每次都像Where(o => o.IsDeleted != true)

那样指定

(首先使用EF4 CTP5代码)

1 个答案:

答案 0 :(得分:0)

我通过在我的通用存储库中执行此操作解决了这个问题,我还为没有isDeleted的实体创建了一个只读存储库(它们根本不是由应用程序管理,只是阅读),readonly repo获取所有记录

简单repo继承readonly并重写不应返回标记为isDeleted = false的实体的方法;

应该只标记为IsDeleted = true的实体继承自DelEntity

public class DelEntity : Entity, IDel
{
    public bool IsDeleted { get; set; }
}

我的通用存储库:

public class Repo<T> : ReadRepo<T>, IRepo<T> where T : DelEntity, new()
    {
        public Repo(IDbContextFactory a) : base(a)
        {
        }

...
        public override IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
        {
            return c.Set<T>().Where(predicate).Where(o => o.IsDeleted == false);
        }

        public override IEnumerable<T> GetAll()
        {
            return c.Set<T>().Where(o => o.IsDeleted == false);
        }
    }

我的只读操作存储库

public class ReadRepo<T> : IReadRepo<T> where T : Entity, new()
    {
        protected readonly DbContext c;

        public ReadRepo(IDbContextFactory f)
        {
            c = f.GetContext();
        }

        public T Get(long id)
        {
            return c.Set<T>().Find(id);
        }

        public virtual IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
        {
            return c.Set<T>().Where(predicate);
        }

        public virtual IEnumerable<T> GetAll()
        {
            return c.Set<T>();
        }

        public int Count()
        {
            return c.Set<T>().Count();
        }

    }

这个解决方案对我的情况有点具体,但希望你可以从中得到一些想法