Как исключить свойства после использования Include () для фильтрации - PullRequest
0 голосов
/ 07 мая 2018

Чтобы отфильтровать список элементов, я использую тип связанного свойства, подобного этому.

var list = Context.Items
    .Include(_ => _.Details)
    .Where(_ => _.Details.Kind == kind));

return list;

Возвращает полный список, отфильтрованный по kind , что в данном случае довольно плохо, поскольку свойство Details большое, точно дублируется в каждом возвращаемом элементе (нет двух подробностей о один и тот же вид может отличаться) и список предметов может быть довольно длинным.

Итак, при использовании kind в Details для фильтрации правильного подмножества элементов, я хочу, чтобы поле было пустым при его возврате. Один из способов решить эту проблему - получить идентификаторы всех предметов, а затем выбрать на основе этого. Кажется неэффективным и медленным. Другой способ - перенести направляющую в класс Item и использовать ее для фильтрации. Это кажется дублирующим и навязчивым для модели данных.

Есть ли аккуратный способ отбросить включенные свойства?

Я подумываю об эквивалентном следующем (не работающем, безобразном) образце.

var list = Context.Items
    .Include(_ => _.Details)
    .Where(_ => _.Details.Kind == kind));

return list.Forget(_ => _.Details);

1 Ответ

0 голосов
/ 07 мая 2018

Include требуется только в том случае, если вы хотите, чтобы данные этого навигационного свойства, ну, включали , в результат.

Операции, переведенные в SQL, такие как GroupBy и Where, не требуют использования Include, поэтому вы можете просто сделать:

var list = Context.Items.Where(_ => _.Details.Kind == kind));

Другая распространенная ошибка (насколько я видел) - использование Include с Select. Когда вы используете Select, все Include эффективно отбрасываются.

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