Вы должны войти, чтобы создавать сообщения и темы.

Вывод таблицы в

Приветствую всех.
Вопрос такой: У меня есть база данных MS SQL в ней две таблицы: FizLica, Podrazdel. Использую Entity Framework 6.0 для миграции. 
Таблицы связаны между собой. Хочу вывести в dataGrid одной строкой данные из таблицы FizLica и Podrazdel. 

Класс FizLica

using System.ComponentModel.DataAnnotations;

namespace GA.SikList.DataBase.Tabels
{
    /// <summary>
    /// Справочник физических лиц:<br/>
    /// IDFizLica - идентификатор<br/>
    /// PodrazdelID - ссылка на подразделение<br/>
    /// FIO - Фио физлица<br/>
    /// Sex - Пол физлица<br/>
    /// isRab - Рабочий или ИТР (true - рабочий)<br/>
    /// TabNumber - Табельный номер<br/>
    /// </summary>
    internal class FizLica
    {
        /// <summary>Идентификатор физического лица</summary>
        [Key]
        public int IDFizLica { get; set; }

        /// <summary>ID подраздела</summary>
        public int? IDPodrazdel { get; set; }
        public virtual Podrazdel Podrazdel { get; set; }

        /// <summary>ФИО физического лица</summary>
        public string FIO { get; set; }

        /// <summary>Пол физического лица</summary>
        public string Sex { get; set; }

        /// <summary>
        /// Рабочий или ИТР (true - рабочий)
        /// </summary>
        public bool isRab { get; set; }

        /// <summary>Табельный номер физического лица</summary>
        public int TabNumber { get; set; }
    }
}

Класс Podrazdel

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace GA.SikList.DataBase.Tabels
{
    /// <summary>
    /// Таблица подразделений:<br/>
    /// IDPodrazdel - идентификатор<br/>
    /// NamePodrazdel - имя подразделения<br/>
    /// </summary>
    internal class Podrazdel
    {
        /// <summary>Идентификатор подразделения</summary>
        [Key]
        public int IDPodrazdel { get; set; }

        /// <summary>Название подразделения</summary>
        public string NamePodrazdel { get; set; }

        public virtual ICollection<FizLica> FizLicas { get; set; }

        public Podrazdel()
        {
            FizLicas = new List<FizLica>();
        }
    }
}

Класс-контекст этих данных (FizLicaContext)

using GA.SikList.DataBase.Tabels;
using System.Data.Entity;

namespace GA.SikList.DataBase.Contexts
{
    /// <summary>
    /// Контекст взаимодействия с базой данных<br/>
    /// Podrazdels - хранит набор объектов подраздела<br/>
    /// FizLicas - хранит набор объектов физических лиц<br/>
    /// Через это свойство будет осуществляться связь с таблицей объектов User в бд
    /// </summary>
    internal class FizLicaContext : DbContext
    {
        public FizLicaContext()
           : base("DbConnection")
        { }

        /// <summary>Podrazdels - хранит набор объектов подраздела<br/></summary>
        public DbSet<Podrazdel> Podrazdels { get; set; }

        /// <summary>Podrazdels - хранит набор объектов физических лиц<br/></summary>
        public DbSet<FizLica> FizLicas { get; set; }
    }
}

Комменты в коде - для удобства понимания, надеюсь поможет разобраться. 

Пробую выводить данным образом, но получается некорректно.

Вот тут беда тоже может быть

private void InitializeDataFizLica()
        {
            using (FizLicaContext db = new FizLicaContext())
            {
                db.FizLicas.Include(p => p.Podrazdel).Load();
                FizLicaGrid.DataSource = db.FizLicas.Local.ToBindingList();
            }
        }

И по итогу получается такое в базе: Вывод PS (фото не загрузилось, а на imgur мне не разрешили регистрацию по номеру телефона из рб https://prnt.sc/GpgQLskercc5 )

Тут хотелось бы ещё избавится от лишнего IDPodrazdel (их два, один показывает цифру 1, а второй похоже ссылку на объект??)

Буду рад любому ответу\обсуждению данной темы. Спасибо!

Приветствую.
Самый простой способ – создать анонимный тип из Select запроса. В идеале, добавить отдельную ViewModel для выборки. Привязывать сущности EF напрямую к UI очень нежелательно и в большинстве случаев совершенно никак не уменьшит сложность.

Листинг

using var context = new FizLicaContext();

var response = await context.FizLicas
    .Include(f => f.Podrazdel)
    .Select(f => new
    {
        Id = f.IDFizLica,
        FullName = f.FIO,                
        ServiceNumber = f.TabNumber,
        Subdivision = f.Podrazdel.NamePodrazdel
    }).ToListAsync();

FizLicaGrid.DataSource = response;


Немного про качество кода
Вставлю ещё свои пять копеек по коду в целом. Крайне желательно избегать транслитерации при именовании переменных. Также не помешает немного изменить дизайн БД, например, поменять тип данных Sex на заранее определённый enum в соответствии со стандартом ISO. Также лучше разделить ФИО на отдельные свойства, т.к. ФИО всегда можно собрать из частей, но разложить возможно не всегда.

Цитата: Dapofig от 03.09.2022, 00:56

Приветствую.
Самый простой способ – создать анонимный тип из Select запроса. В идеале, добавить отдельную ViewModel для выборки. Привязывать сущности EF напрямую к UI очень нежелательно и в большинстве случаев совершенно никак не уменьшит сложность.

Листинг

 
 
 
 
using var context = new FizLicaContext();
 
var response = await context.FizLicas
.Include(f => f.Podrazdel)
.Select(f => new
{
Id = f.IDFizLica,
FullName = f.FIO,
ServiceNumber = f.TabNumber,
Subdivision = f.Podrazdel.NamePodrazdel
}).ToListAsync();
 
FizLicaGrid.DataSource = response;
using var context = new FizLicaContext(); var response = await context.FizLicas .Include(f => f.Podrazdel) .Select(f => new { Id = f.IDFizLica, FullName = f.FIO, ServiceNumber = f.TabNumber, Subdivision = f.Podrazdel.NamePodrazdel }).ToListAsync(); FizLicaGrid.DataSource = response;
 
using var context = new FizLicaContext();

var response = await context.FizLicas
    .Include(f => f.Podrazdel)
    .Select(f => new
    {
        Id = f.IDFizLica,
        FullName = f.FIO,                
        ServiceNumber = f.TabNumber,
        Subdivision = f.Podrazdel.NamePodrazdel
    }).ToListAsync();

FizLicaGrid.DataSource = response;

<img class="lazyload" src="data:;base64," alt="" width="494" height="212" data-orig-src="https://i.imgur.com/aD8TOCr.png" style="color: #25d39d !important" />


Немного про качество кода
Вставлю ещё свои пять копеек по коду в целом. Крайне желательно избегать транслитерации при именовании переменных. Также не помешает немного изменить дизайн БД, например, поменять тип данных Sex на заранее определённый enum в соответствии со стандартом ISO. Также лучше разделить ФИО на отдельные свойства, т.к. ФИО всегда можно собрать из частей, но разложить возможно не всегда.

Спасибо Вам большое!
Прислушаюсь к Вам и сделаю так как советуете, так как на самом деле это всё звучит проффесионально и логично.
Очень рад, что поделились опытом. Ещё раз спасибо большое!