Получение “была предпринята попытка отложенной загрузки свойства навигации в отдельном объекте” после попытки передать выражение alambda в предложение Where

#ef-core-2.1

#ef-core-2.1

Вопрос:

Я использую Entity Framework Core 2.1.2 с включенной отложенной загрузкой и выполняю запрос. Если я пытаюсь передать лямбда-выражение, я всегда получаю следующее исключение:

.Исключение InvalidOperationException: ошибка, сгенерированная для предупреждения «Microsoft.EntityFrameworkCore.Инфраструктура.DetachedLazyLoadingWarning: Была предпринята попытка отложенной загрузки свойства навигации ‘Children’ для отдельного объекта типа ‘ParentProxy’. Отложенная загрузка не поддерживается для отдельных объектов или объектов, которые загружаются с помощью ‘AsNoTracking()’.’

Вот некоторый код :

 public class User
    {
        public virtual ICollection<UserRole> UserRoles { get; set; } = new HashSet<UserRole>();
    }

public class UserRole
    {
        public int UserId { get; set; }

        public int RoleId { get; set; }

        public virtual User User { get; set; }
    }
  

Контекст моей базы данных:

  public IServiceProvider ConfigureServices(IServiceCollection services)
    {
                services.AddDbContext<Context>(options =>
                {
                    options.UseLazyLoadingProxies();
                    options.UseSqlServer(Configuration.GetConnectionString("connection"));
                });
    }
  

Вот как это работает:

 _userRepository.Table.Where(user => user.UserRoles.Any(userRole => userRole.RoleId == 10)).ToList()
  

И вот почему это не:

 _userRepository.Table.Where(user => condition(user)).ToList()
  

Где условие:

 Func<User, bool> condition
  

Пример:

 Func<User, bool> result = (user) => user.UserRoles.Any(role => role.RoleId == 10) 
  

Прошу прощения за неправильное форматирование. Но я надеюсь, что вы понимаете мою проблему.

Комментарии:

1. Проблема в Func<…> . Запросы EF лучше всего работают с Expression<Func<…>> .

2. @IvanStoev Спасибо. Я думал, что это не работает, но это работает!