我想要一个名为FirstOrDefaultCache()
会检查
dbContext.EntityName.Local.FirstOrDefault(condition)
,仅限于 如果为null,请检查dbContext.EntityName.FirstOrDefault(condition)
。
我从另一篇文章中得到以下信息,该信息可以正常使用:
public static TEntity FirstOrDefaultCache<TEntity>(this DbSet<TEntity> queryable,
Expression<Func<TEntity, bool>> condition) where TEntity : class
{
return queryable
.Local.FirstOrDefault(condition.Compile()) // find in local cache
?? queryable.FirstOrDefault(condition);
// if local cache returns null check the db
}
但是,我无法在.Include()
之后使用此功能。
dbContext.EntityName.FirstOrDefaultCache(some condition);
有效,但dbContext.EntityName.Include(x => x.NavProperty).FirstOrDefaultCache(some condition);
不起作用。
答案 0 :(得分:0)
您需要使用IQueryable<T>
才能在Include
或Where
之后使用您的扩展程序或其他任何方法。但由于查询结果未缓存,因此您无法在扩展程序中使用Local
。
您的选项是禁用某些包含属性的延迟加载,以避免Include
或您可以为查询实现某种二级缓存。例如this one,但我没有尝试过它,它已经很老了。
你这样使用它:
var result = q.Take(10).FromCache()
在你的情况下,它可能看起来像:
dbContext.EntityName.Include(x => x.NavProperty).FromCache().First(condition)