对不起,如果我的问题有点愚蠢,但我真的被这个基本的东西困住了。我有具有以下方法的通用存储库:
protected List<T> GetEntities(Expression<Func<T, bool>> whereExpression)
{
var query = Context.Set<T>().AsQueryable();
if (whereExpression != null)
query = query.Where(whereExpression).AsQueryable();
List<T> result = query.ToList();
return result;
}
我们的应用程序应该允许在不提交到数据库的情况下处理数据。但是在任何时候用户都应该能够保存更改。为了添加或删除条目,我使用:
Context.Set<T>().Add(entity);
和
Context.Set<T>().Remove(entity);
但是在我调用 GetEntities 后,删除的实体再次出现,新实体不会出现。显然,GetEntities 直接查询数据库,不考虑本地更改。
所以,我的问题:有没有简单的方法可以将从数据库加载的数据的where表达式与本地更改结合起来?
谢谢。
我有时会使用这个小方法来优先考虑本地数据:
public static IQueryable<TEntity> PreferLocal<TEntity>(this DbSet<TEntity> dbSet,
Expression<Func<TEntity, bool>> predicate)
where TEntity : class
{
if (dbSet.Local.AsQueryable().Any(predicate))
{
return dbSet.Local.AsQueryable().Where(predicate);
}
return dbSet.Where(predicate);
}
它首先尝试在Local
集合中查找实体(因为它都在内存中,所以额外的Any
并不昂贵)。如果它们不存在,则查询数据库。
在您的存储库中,您可以像这样使用:
return PreferLocal(Context.Set<T>(), whereExpression).ToList();
但也许你也应该重新考虑你的Context
的生命周期。看起来你有一个长期存在的上下文,不建议这样做。