Как активировать загрузку с помощью Include (), только если не ноль? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь сделать:

var abc = Context.PersonSet.Include(p=>p.Child).ToList();

Но не у всех людей есть ребенок.Итак, я получаю:

Type Error Я хотел бы получить всех лиц, и если ребенок не нулевой, я хочу включить его.Было бы также хорошо, чтобы включить ребенка как ноль.

Ответы [ 5 ]

0 голосов
/ 19 декабря 2018

Я не знаю, почему люди продолжают голосовать за такие решения:

Include(p => p.NavProp ?? new List<NavPropType>())

Поскольку это не сработает, это недопустимо для Include():

InvalidOperationException:

Лямбда-выражение свойства Include p => (p.NavProp ?? value(System.Collections.Generic.List'1[NavPropType])) недопустимо.Выражение должно представлять доступ к свойству: t => t.MyProperty.

Чтобы указывать навигацию, объявленную в производных типах, укажите лямбда-параметр с явно заданным типом целевого типа, например, (Derived d) => d.MyProperty.Для получения дополнительной информации о включении связанных данных см. http://go.microsoft.com/fwlink/?LinkID=746393.

Решение: объявите вашу собственность со значением по умолчанию:

public class Foo
{
    public List<Bar> Bars { get; set; } = new List<Bar>();
}

Это гарантирует, что Bars не будетбыть null, если соответствующие записи не найдены.

0 голосов
/ 19 декабря 2018

Вы просто используете оператор слияния нуля :

var abc = Context.PersonSet.Include(p => p.Child ?? new Collection<Child>());

Возвращает левый операнд, который равен a.Child, если a.Child не равен нулю, в противном случае он возвращаетправый операнд, который является Collection из Child.

0 голосов
/ 19 декабря 2018

Исключение не должно исходить из этой строки.Include() должен использовать LEFT JOIN, который в точности соответствует тому, что вы просите: "Я хотел бы получить всех людей, и если ребенок не равен нулю, я хочу включить его" .Чтобы убедиться в этом, проверьте SQL, сгенерированный из вашего LINQ.

Чтобы устранить эту проблему, посмотрите код, который использует результат запроса abc, и посмотрите, обрабатывает ли он Childколлекция должным образом (т.е. проверка, является ли коллекция пустой).

0 голосов
/ 19 декабря 2018

Вы можете использовать GroupJoin, чтобы получить всех людей и загрузить их детей, если у них есть ребенок: (учтите, что при таком подходе у вас должен быть DbSet of Children в вашем контексте)

Context.PersonSet.GroupJoin(Context.Children, p => p.Id, c => c.PersonId, (p, c) =>
                 new { Person = p, Child = c }).ToList();
0 голосов
/ 19 декабря 2018

вернуть пустого потомка вместо нуля

 Context.PersonSet.Include(a => ((a.Child == null) ? new Collection<Child>() : a.Child));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...