为Entity Framework编写扩展方法

时间:2016-04-08 02:04:43

标签: c# entity-framework linq linq-to-entities extension-methods

我想要一个名为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); 不起作用。

1 个答案:

答案 0 :(得分:0)

您需要使用IQueryable<T>才能在IncludeWhere之后使用您的扩展程序或其他任何方法。但由于查询结果未缓存,因此您无法在扩展程序中使用Local

您的选项是禁用某些包含属性的延迟加载,以避免Include

您可以为查询实现某种二级缓存。例如this one,但我没有尝试过它,它已经很老了。

你这样使用它:

var result = q.Take(10).FromCache()

在你的情况下,它可能看起来像:

dbContext.EntityName.Include(x => x.NavProperty).FromCache().First(condition)