Запрос Linq с предложением where для связанных данных - PullRequest
0 голосов
/ 15 января 2020

У меня есть контекст данных с использованием двух SQL таблиц (A и B), которые запрашиваются с использованием следующего кода:

                    var query = from b in _ctx.A
                                .Where(b => b.Flag == true).Include(c => c.B)
                                select b;

Столбец Flag находится в таблице A. Я хочу добавить дополнительное условие where к запросу, который проверяет наличие столбца с именем Qty в таблице B для значений> 10.

Я попробовал следующий код, но получил ошибку:

                    var query = from b in _ctx.A
                                .Where(b => b.Flag == true)
                                .Include(c => c.B.Where(i => i.Qty >= 10))
                                select b;

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

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

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

1 Ответ

1 голос
/ 15 января 2020

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

Невозможно отфильтровать коллекцию навигации, так как она устанавливает отношение. Он всегда имеет значение «все связанные сущности где-то еще».

Но мы можем отменить запрос, предполагая, что у classB есть свойство A класса A.

             var query = _ctx.B
                            .Where(b => b.Qty >=10 && b.A.Flag);
                            .Include(b => b.A)

Предложение Where в этом case не будет загружать свойство B, это просто оценивается на сервере. Включение здесь действительно необходимо для заполнения свойства A.

Теперь вы получите список всех B с ассоциированными A. Если вы хотите, чтобы ваша коллекция A, вы можете сгруппировать по A

             var query = _ctx.B
                            .Where(b => b.Qty >=10 && b.A.Flag)
                            .GroupBy(x => x.A);

Это приведет к коллекции A со всеми связанными B, которые имеют Qty> 10.

...