Reputation: 77
i will try build some cascade datagridview
Layer
layerID,LayerName (LayerID = PK )
Gor
LayerID , GorID , GorName ( GorID = PK and LayerID = FK )
Gru
GorID , GruID , GruName ( GruID = Pk and GorID = FK )
i start with this code
using (UnitOfWork db = new UnitOfWork())
{
DGVCharts.AutoGenerateColumns = false;
var result = from layer in db.LayerRepository.Get()
join gor in db.GorRepository.Get() on layer.LayerID equals gor.LayerID
select new
{
layer.LayerID,
layer.LayerName,
gor.GorID,
gor.GorNumber,
};
DGVCharts.DataSource = result.ToList();
}
after i use top code i see this and its ok
now i will try load more colum i grow my code to this
using (UnitOfWork db = new UnitOfWork())
{
DGVCharts.AutoGenerateColumns = false;
var result = from layer in db.LayerRepository.Get()
join gor in db.GorRepository.Get() on layer.LayerID equals gor.LayerID
join gru in db.GruRepository.Get() on gor.GorID equals gru.GorID
select new
{
layer.LayerID,
layer.LayerName,
gor.GorID,
gor.GorNumber,
gru.GruID,
gru.GruNumber
};
DGVCharts.DataSource = result.ToList();
}
after update my code i see this
where is manager in (Gor Colum) ?? manager no child and i cant see manager in my datagridview !
how i can see manager too ?
Upvotes: 1
Views: 105
Reputation: 4903
By using Left join, you can get manager
if not has any relation in Gru
Table.
I'm testing the following code for LinqToObject : `
1 - Creating test classes:
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 - Initializing the collections:
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 request:
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 - Demo
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 - Result
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: ::
Note that, GruId
and GruName
are null because no manager
in Gru
Table.
I hope this help you fix the issue.
Upvotes: 1