我正在使用EF 5.0和Code First。在我的通用存储库中,我有一种以逻辑方式排除记录的方法。此方法实际执行更新,将实体字段的状态设置为false。
我想截取我的查询,只过滤status == true。
有一种简单的方法吗?例如:
new GenericRepository<Entity>().ToList();
// and internally it will filter where status == true.
答案 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();