Thiago Custodio
Thiago Custodio

Reputation: 18387

entity framework filter logical deleted records

I'm using EF 5.0 and Code First. In my generic repository I have a method for exclude records in a logical way. This method actually perform a update, setting the status of the entity field to false.

I would like to intercept my queries, and filter only where status == true.

Is there a easy way to do that? Ex:

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

Upvotes: 0

Views: 574

Answers (3)

Rapha&#235;l Althaus
Rapha&#235;l Althaus

Reputation: 60493

create a generic method

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

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

}

and if you want something more linked to your status property, you have to use reflection and build the Lambda by yourself (as you can't use interfaces with linq to entites queries).

Something like that (untested), calling the generic All method.

   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);
   } 

Upvotes: 2

Ben Gulapa
Ben Gulapa

Reputation: 1619

You can filter it using Where.

.Where(e => e.Status == true).ToList();

Upvotes: 0

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236208

You can make all your entities implement some IDeletable interface:

public interface IDelitable
{
    bool IsDeleted { get; }
}

And add constraint to generic parameter of your repository

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

And add filter when you are returning values:

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

Upvotes: 2

Related Questions