У меня есть QueryFilter в моем AppDbContext EfCore 2.2:
builder.Entity<MessageReceiver> ().HasQueryFilter (
(q) => (q.ReciverId == _uai.LoggedInUserId) ||
(q.Message.SenderId == _uai.LoggedInUserId));
этот код работает нормально, потому что я внедрил пользовательскую службу (_uai
) для проверки информации о вошедшем в систему пользователе в мой AppDbContext.
public class AppDbContext : DbContext {
private readonly IUserAccessInfoService _uai;
public AppDbContext (DbContextOptions<AppDbContext> options, IUserAccessInfoService userAccessInfo) : base (options) {
_uai = userAccessInfo;
}
но я не могу реорганизовать этот код и перенести все выражение в мой сервис! после рефакторинга этого кода в сервис '_uai' я использую это как:
builder.Entity<MessageReceiver> ().HasQueryFilter (_uai.GetMessageQueryFilter ());
и в моем сервисе 'uai' я рефакторинг выражения:
// UserAccessInfoService ....
public Expression<Func<MessageReceiver, bool>> GetMessageQueryFilter () {
return (q) =>
(q.ReciverId == LoggedInUserId) ||
(q.Message.SenderId == LoggedInUserId);
}
// this way loggedInUser is null in runtime
действительно имеет выражения некоторые встроенные возможности кеша? проблема в том, что EFCore не использует внедренные служебные значения, когда я рефакторинг этого кода и LoggedInUserId является нулевым после рефакторинга. я думаю, что есть какое-то кэширование, которое efcore использует для своих выражений.