Linq присоединиться к возвращающемуся родителю, даже если child равен нулю

Я хочу выбрать все строки, где fake2 равен нулю, и все строки с объединением на fake2. Приведенный ниже код делает это хорошо, но я хочу сделать все это в запросе select linq для повышения эффективности.

var rows = (
            from a in crmLinqContext.fakeSet
            join b in crmLinqContext.fake2Set on a.fake2.Id equals b.Id
            join c in crmLinqContext.fake3Set on b.field equals c.field
            where c.anotherField == "THIS_BIT_OF_TEXT"
            select a);

List<myObject> objects = new List<myObject>();
foreach(var row in rows)
{
    objects.Add(row);
}
 rows = (
    from a in crmLinqContext.fakeSet
    where s.fake2 == null
    select a);

foreach (var row in rows)
{
    objects.Add(row);
}
return objects;

2 ответа

Решение

Используйте левое соединение в linq примерно так, как показано ниже, это не проверяется, но он делает то, что он оставляет внешние соединения fakeSet и fakeSet2.

var rows =
    from a in crmLinqContext.fakeSet
    join b in crmLinqContext.fake2Set on a.fake2.Id equals b.Id into subset
    from b in subset.DefaultIfEmpty()
    join c in crmLinqContext.fake3Set on b.field equals c.field
    where c.anotherField == "THIS_BIT_OF_TEXT"
    select a;
var rows = (
            from a in crmLinqContext.fakeSet
            join b in crmLinqContext.fake2Set on a.Id equals b.Id
            join c in crmLinqContext.fake3Set on b.field equals c.field
            where c.anotherField == "THIS_BIT_OF_TEXT"
            select a)
            .Concat(
            from a1 in crmLinqContext.fakeSet
            where a1.fake2 == null
            select a1);
Другие вопросы по тегам