实体框架过滤逻辑删除的记录

时间:2013-07-12 11:32:33

标签: entity-framework entity-framework-5

我正在使用EF 5.0和Code First。在我的通用存储库中,我有一种以逻辑方式排除记录的方法。此方法实际执行更新,将实体字段的状态设置为false。

我想截取我的查询,只过滤status == true。

有一种简单的方法吗?例如:

new GenericRepository<Entity>().ToList(); 
// and internally it will filter where status == true.

3 个答案:

答案 0 :(得分:2)

您可以让所有实体实现一些IDeletable接口:

public interface IDelitable
{
    bool IsDeleted { get; }
}

并为您的存储库的泛型参数添加约束

public class GenericRepository<T>
   where T: class, IDelitable

在返回值时添加过滤器:

context.Set<T>().Where(e => !e.IsDeleted)

答案 1 :(得分:2)

创建通用方法

public IQueryable<T> All<T>(Expression<Func<T, bool>> predicate) {

  return context.Set<T>().Where(predicate);

}

如果你想要更多链接到你的status属性的东西,你必须自己使用反射并构建Lambda(因为你不能使用linq的接口来引发查询)。

类似的东西(未经测试),调用通用的All方法。

   public IQueryable<T>AllButDeleted<T>() {
     var property = typeof(T).GetProperty("status");
     //check if T has a "status" property
     if (property == null && || property.PropertyType != typeof(bool)) throw new ArgumentException("This entity doesn't have an status property, or it's not a boolean");
     //build the expression
     //m =>
      var parameter = new ParameterExpression(typeof(T), "m");
     // m.status
     Expression body = Expression.Property(parameter, property);
     //m.status == true (which is just m.status)
     body = Expression.IsTrue(body);
     //m => m.status
     var lambdaPredicate = Expression.Lambda<Func<T, bool>>(body, new[]{parameter});
     return All(lambdaPredicate);
   } 

答案 2 :(得分:0)

您可以使用Where。

过滤它
.Where(e => e.Status == true).ToList();