Использование LINQ для запроса четырех вложенных объектов. - Включите, где условие - PullRequest
0 голосов
/ 22 марта 2020

У меня есть четыре класса Предложение, Раздел, Поле и Опция:

Если в предложении есть разделы, и в каждом разделе есть несколько полей, и у каждого поля есть несколько параметров, как показано:

    public class Offer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Section> Sections { get; set; }
    }

    public class Section
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Field> Fields { get; set; }
    }

    public class Field
    {
        public int Id { get; set; }
        public string Type { get; set; } //[question, group]
        public ICollection<Option> Options { get; set; } 
    }

    public class Option
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

Я пытался получить предложение по идентификатору, включая вложенные сущности, и этот код отлично работает:

    var offer = _context.Offers
        .Include(o => o.Sections
            .Select(s => s.Fields
            .Select(f => f.Options)))
        .FirstOrDefault(o => o.Id == offerId);

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

    var offer = _context.Offers
        .Include(o => o.Sections
            .Select(s => s.Fields.Where(f => f.Type == "question")
            .Select(f => f.Options)))
        .FirstOrDefault(o => o.Id == offerId);

и я получаю эту ошибку:

Выражение «Включить путь» должно ссылаться на свойство навигации, определенное для типа. Используйте пунктирные пути для ссылочных свойств навигации и оператор Select для свойств навигации коллекции. Имя параметра: путь

Я рассмотрел множество вопросов и до сих пор не могу этого достичь: (

Linq: запрос с тремя вложенными уровнями

EF LINQ включает в себя вложенные сущности [дубликаты]

Использование LINQ для запроса трех прав. - Включение выражения пути должно ссылаться на свойство навигации, определенное для типа

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Включить () используется для быстрой загрузки. Это процесс, при котором запрос для одного типа объекта также загружает связанные объекты как часть запроса, поэтому нам не нужно выполнять отдельный запрос для связанных объектов. Где () в настоящее время не поддерживается внутри Включить.

0 голосов
/ 22 марта 2020

Если вы хотите просто отфильтровать результат, вы можете сделать что-то вроде этого:

        var offer = _context.Offers
         .Include(o => o.Sections
         .Select(s => s.Fields
         .Select(f => f.Options)))
         .FirstOrDefault(o => o.Id == offerId);
        var filtered_offer = 
        new Offer
        {
            Sections = offer.Sections.Select(S => new Section
            {
                Id = S.Id,
                Name = S.Name,
                Fields = S.Fields.Where(f => f.Type == "question").ToList()
            }).ToList(),
            Id = offer.Id,
            Name = offer.Name
        };
...