Фильтрация «включаемых» объектов в EF Core - PullRequest
0 голосов
/ 26 января 2019

У меня есть следующие модели

 public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    public List<PersonRole> PersonRoles { get; set; }

}

public class RoleInDuty
{
    public int roleInDutyId { get; set; }
    public string Name { get; set; }
    public int typeOfDutyId { get; set; }
    public TypeOfDuty typeOfDuty { get; set; }
    public List<PersonRole> PersonRoles { get; set; }

}
public class PersonRole
{
    public int PersonId { get; set; }
    public Person Person { get; set; }
    public int RoleInDutyId { get; set; }
    public RoleInDuty RoleInDuty { get; set; }
}

И теперь я могу загрузить всех людей со всеми их ролями, используя следующий код:

 var  people = _context.Persons
      .Include(p => p.PersonRoles)
        .ThenInclude(e => e.RoleInDuty).ToList();

Но я не хочу загружать все данныеСписок, мне нужно загрузить PersonRole в соответствии с введенным typeOfDutyId.Я пытаюсь решить эту проблему с помощью следующего кода

people = _context.Persons
  .Include(p => p.PersonRoles
    .Where(t=>t.RoleInDuty.typeOfDutyId == Id)).ToList();

Но ошибка выброса VS

InvalidOperationException: лямбда-выражение свойства Include 'p => {из PersonRole t в p.PersonRoles, где ([t] .RoleInDuty.typeOfDutyId == __typeOfDuty_typeOfDutyId_0) select [t]} 'недопустимо.Выражение должно представлять доступ к свойству: 't => t.MyProperty'.Чтобы нацелить навигацию, объявленную на производные типы, укажите лямбда-параметр с явно заданным типом целевого типа, например, «(Derived d) => d.MyProperty».Для получения дополнительной информации о включении связанных данных см. http://go.microsoft.com/fwlink/?LinkID=746393.

Как я понимаю, я не могу получить доступ к свойству RoleInDuty.typeOfDutyId , потому что я его пока не включаю.

Я решил эту проблему с помощью следующего кода

people = _context.Persons
  .Include(p => p.PersonRoles)
    .ThenInclude(e=>e.RoleInDuty).ToList();       
foreach (Person p in people)
{
  p.PersonRoles = p.PersonRoles
    .Where(e => e.RoleInDuty.typeOfDutyId == Id)
    .ToList();
}

1 Ответ

0 голосов
/ 27 января 2019

devnull показать следующее Как отфильтровать "Включить" сущности в структуру сущностей? , и там та же проблема, я прочитал ее и нашел ответ. Решить мою проблему можно с помощью следующего:

var temp = _context.Persons.Select(s => new
  {
    Person = s,
    PersonRoles= s.PersonRoles
      .Where(p => p.RoleInDuty.typeOfDutyId == this.typeOfDuty.typeOfDutyId)
      .ToList()
  }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...