对不起,如果我的问题有点愚蠢,但我真的陷入了这个基本的问题。 我有通用的存储库,其方法如下:
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-expression与从数据库加载的数据和本地更改结合起来?
感谢。
答案 0 :(得分:1)
我有时会使用这个小方法来优先选择本地数据:
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
的生命周期。看起来你有一个长期的背景,不推荐这样做。