dont Show Parent DataTable, если у них нет дочернего элемента в datagridview - PullRequest
1 голос
/ 26 апреля 2020

Я постараюсь построить несколько каскадных данных.

Layer

layerID, LayerName (LayerID = PK)

Gor

LayerID, GorID, GorName ( GorID = PK и LayerID = FK)

Gru

GorID, GruID, GruName (GruID = Pk и GorID = FK)

я начинаю с этого кода

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();

            }

после того, как я использую верхний код, я вижу это и все в порядке enter image description here

теперь я попытаюсь загрузить больше столбца, я увеличу свой код до этого

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();

            }

после обновления мой код я вижу это

enter image description here

где находится менеджер (Gor Colum) ?? менеджер не ребенок, и я не могу видеть менеджера в моем datagridview!

как я тоже могу видеть менеджера?

1 Ответ

1 голос
/ 28 апреля 2020

Используя левое соединение , вы можете получить 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 Таблица.

Надеюсь, это поможет вам решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...