Синтаксис метода LINQ, чтобы включить 4 уровня - PullRequest
0 голосов
/ 20 мая 2018

Я безуспешно искал (или не знал, как правильно его искать), поэтому я прихожу к вам.

Проверьте эти тестовые классы:

public class A {
    int Id;
    ICollection<B> Bs;
}
public class B {
    int Id;
    int AId;
    ICollection<C> Cs;
}
public class C {
    int Id;
    int BId;
    ICollection<D> D;
}
public class D {
    int Id;
    int CId;
    bool Show;
}

Что я 'я пытаюсь сделать, это использовать нетерпеливая загрузка , чтобы получить все эти классы за 1 вызов (убедившись, что БД вызывается только один раз).

Ниже приведен фактический TSQL Я хочу преобразоватьк LINQ Method синтаксису (я думаю, что правильный язык), а не LINQ Query синтаксис.

SELECT *
FROM A
LEFT JOIN B ON B.AId = A.Id
LEFT JOIN C ON C.BId = B.Id
LEFT JOIN D ON D.CId = C.Id
WHERE A.Id = 1

Вот что я получил до сих пор

var x = db.A
        .Include(a => a.B)
        .Include(a => a.Bs.Select(b => b.C)
        // How do I get D?
        .FirstOrDefault(a => a.Id == 1);

Пока я нене думаю, что это важно, я хотел бы отметить, на всякий случай, что в конце мне нужно сделать некоторые вещи с A, а позже мне нужно будет получить все DShow == true.

1 Ответ

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

Ваша примерная модель немного противоречива, вы используете разные имена для классов вашей модели и запроса LINQ, например, B против Bs.Кроме того, я считаю, что вы можете достичь того, что вы хотите, вложив еще один Select() в свой внутренний запрос.

например

var x = db.A
    .Include(a => a.Bs.Select(b => b.Cs.Select(c => c.Ds))
    .FirstOrDefault(a => a.Id == 1);
...