Используя левое соединение , вы можете получить manager
, если не имеет никакого отношения к Gru
Таблица.
Я тестирую следующий код для LinqToObject : `
1 - Создание тестовых классов:
public class Layer
{
public int LayerId { get; set; }
public string LayerName { get; set; }
}
public class Gor
{
public int GorId { get; set; }
public int LayerId { get; set; }
public string GorName { get; set; }
}
public class Gru
{
public int GruId { get; set; }
public int GorId { get; set; }
public string GruName { get; set; }
}
public class Das
{
public int DasId { get; set; }
public int GruId { get; set; }
public string DasName { get; set; }
}
2 - Инициализация коллекций:
List<Layer> layers = new List<Layer>
{
new Layer{LayerId=1, LayerName="Main"}
};
List<Gor> gors = new List<Gor>
{
new Gor{GorId=1, GorName="team01", LayerId=1},
new Gor{GorId=2, GorName="team02", LayerId=1},
new Gor{GorId=3, GorName="manager", LayerId=1},
};
List<Gru> grus = new List<Gru>
{
new Gru{GruId=1, GruName="leader", GorId=1},
new Gru{GruId=2, GruName="co-leader", GorId=1},
new Gru{GruId=3, GruName="01", GorId=1},
new Gru{GruId=4, GruName="leader", GorId=2},
new Gru{GruId=5, GruName="co-leader", GorId=2},
new Gru{GruId=6, GruName="01", GorId=2},
};
List<Das> dasList = new List<Das>
{
new Das{DasId=1, DasName="das1", GruId=1},
new Das{DasId=2, DasName="das2", GruId=5},
};
3 - Запрос Linq:
var result = (from layer in layers
join gor in gors on layer.LayerId equals gor.LayerId
join gru in grus on gor.GorId equals gru.GorId into leftedGrus
from leftedGru in leftedGrus.DefaultIfEmpty()
join das in dasList on leftedGru?.GruId equals das.GruId into leftDasList
from leftDas in leftDasList.DefaultIfEmpty()
select new
{
layer.LayerId,
layer.LayerName,
gor.GorId,
gor.GorName,
leftedGru?.GruId,
leftedGru?.GruName,
leftDas?.DasId,
leftDas?.DasName
}).ToList();
4 - Демо
foreach(var item in result)
{
Console.WriteLine($"Layer: {item.LayerId}::{item.LayerName}," +
$"Gor: {item.GorId}::{item.GorName},Gru: {item.GruId}::{item.GruName}" +
$",Das: {item.DasId}::{item.DasName}");
}
5 - Результат
Layer: 1::Main,Gor: 1::team01, Gru: 1::leader ,Das: 1::das1
Layer: 1::Main,Gor: 1::team01, Gru: 2::co-leader,Das: ::
Layer: 1::Main,Gor: 1::team01, Gru: 3::01 ,Das: ::
Layer: 1::Main,Gor: 2::team02, Gru: 4::leader ,Das: ::
Layer: 1::Main,Gor: 2::team02, Gru: 5::co-leader,Das: 2::das2
Layer: 1::Main,Gor: 2::team02, Gru: 6::01 ,Das: ::
Layer: 1::Main,Gor: 3::manager,Gru: :: ,Das: ::
Обратите внимание, что GruId
и GruName
равны нулю, поскольку manager
in Gru
Таблица.
Надеюсь, это поможет вам решить проблему.