0

Я хотел бы иметь метод расширения называется FirstOrDefaultCache()Дать метод расширения для Entity Framework

, который будет проверять dbContext.EntityName.Local.FirstOrDefault(condition), и только если что равно нулю, проверьте 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

Что такое возвращаемый тип '' Include) метод (? Вы можете создать другой метод расширения, который будет работать с этим типом. – Brad

+0

Это IQueryable , однако я не могу получить доступ .Local в IQueryable и пытается передать его в DbSet , выдает недопустимое исключение литья во время выполнения. – blgrnboy

+0

Вы пытались расширить IQueryable вместо DbSet? –

ответ

0

Для того, чтобы использовать способ расширения после Include или Where или любой другой, вам необходимо использовать IQueryable<T>. Но поскольку результаты запроса не кэшируются, вы не сможете использовать Local в своем расширении.

Ваших вариантов отключить отложенную загрузку для некоторых включены свойств, чтобы избежать Include

или вы могли бы реализовать какое-то кэш второго уровня для запросов. Например, this one, но я не пробовал, и он довольно старый.

использовать его как это:

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

В вашем случае это, вероятно, выглядеть так:

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

Хорошо, я думаю, что теперь я начинаю обворачивать голову. Есть некоторые ситуации в коде, где somet-объект может быть либо уже в dbContext локально (потому что он был просто добавлен), либо был добавлен в предыдущем запуске (другой dbContext), который теперь находится в хранилище БД. Я хочу иметь хороший один лайнер, который будет сначала проверяться локально, а затем проверить магазин. – blgrnboy

Смежные вопросы