Запрос заказа с использованием лямбда-выражения и метода Include - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над запросом Entity-Framework-Core 2.0.Запрос должен отсортировать 2 таблицы по полю «порядок».Пока это то, что у меня есть:

return await _context.FieldsetGroup
                .Include(e => e.Fieldsets.OrderBy(o => o.Order))
                .ThenInclude(e => e.FieldsetFields.OrderBy(o => o.Field.Order))
                .ThenInclude(e => e.Field)
                .FirstOrDefaultAsync(fsg => fsg.FieldsetGroupId == fieldSetGroupId);

Этот запрос возвращает исключение: «Выражение свойства 'e => {из Fieldset o в порядке e.Fieldsets by [o]. Заказ asc select [o]}'недопустимо. Выражение должно представлять доступ к свойству:' t => t.MyProperty '. Для получения дополнительной информации о включении связанных данных см. http://go.microsoft.com/fwlink/?LinkID=746393."

Как отсортировать 2 таблицы?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Одна из более медленных частей запросов к базе данных - это передача выбранных вами данных из СУБД в локальный процесс.Следовательно, разумно ограничить количество передаваемых данных.

Очевидно, что ваш FieldSetGroup имеет ноль или более FieldSets.Каждый FieldSet принадлежит ровно одному FieldsetGroup.Это идентифицируется внешним ключом FieldSetGroupId.Значение этого поля равно Id из FieldSetGroup.

Так что, если у вас есть FieldSetGroup с Id = 10, а у этого FieldSetGroup есть 1000 FieldSets, то каждый FieldSet будет иметь значение внешнего ключа FieldSetGroupId, равное 10. Нет необходимости передавать это значение 1000 раз.

Совет: чтобы ограничить объем передаваемых данных, избегайте передачи большего количества данных, чем необходимо, используйтеSelect вместо Include и выберите только те данные, которые вы действительно планируете использовать.Используйте Include, если вы планируете обновить извлеченные данные.

Если вы используете Select, вы можете заказать все, что захотите:

var result = dbContext.FieldsetGroup
   .Where((fieldSetGroup => fieldSetGroup.FieldsetGroupId == fieldSetGroupId)
   .Select(fieldSetGroup => new
   {
       ... // select the fieldSetGroup properties you plan to use

       FieldSets = fieldSetGroup.FieldSets
           .OrderBy(fieldSet => fieldSet.Order)
           .Select(fieldSet => new
           {
                ... // only select the fieldSet properties you plan to use

                FieldSetFields = fieldSet.FieldSetFields
                    .OrderBy(fieldSetField => fieldSetField.Order)
                    .Select(fieldSetField => new
                    {
                        ...
                    })
                    .ToList(),
                })
                .ToList(),
           })
           .ToList(),
    })
    .FirstOrDefault();
0 голосов
/ 27 сентября 2018

Вы не можете выполнить сортировку (OrderBy) внутри метода Include.Сортировать данные после запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...