Вывод таблицы в
Цитата: Иван от 02.09.2022, 15:13Приветствую всех.
Вопрос такой: У меня есть база данных MS SQL в ней две таблицы: FizLica, Podrazdel. Использую Entity Framework 6.0 для миграции.
Таблицы связаны между собой. Хочу вывести в dataGrid одной строкой данные из таблицы FizLica и Podrazdel.
[spoiler title="Класс 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; } } }[/spoiler]
[spoiler title="Класс 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>(); } } }[/spoiler]
[spoiler title="Класс-контекст этих данных (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; } } }[/spoiler]
Комменты в коде - для удобства понимания, надеюсь поможет разобраться.
Пробую выводить данным образом, но получается некорректно. [spoiler title="Вот тут беда тоже может быть"]
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, а второй похоже ссылку на объект??)
[/spoiler]Буду рад любому ответу\обсуждению данной темы. Спасибо!
Приветствую всех.
Вопрос такой: У меня есть база данных MS SQL в ней две таблицы: FizLica, Podrazdel. Использую Entity Framework 6.0 для миграции.
Таблицы связаны между собой. Хочу вывести в dataGrid одной строкой данные из таблицы FizLica и Podrazdel.
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; }
}
}
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>();
}
}
}
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, а второй похоже ссылку на объект??)
Буду рад любому ответу\обсуждению данной темы. Спасибо!
Цитата: Dapofig от 03.09.2022, 00:56Приветствую.
Самый простой способ – создать анонимный тип из Select запроса. В идеале, добавить отдельную ViewModel для выборки. Привязывать сущности EF напрямую к UI очень нежелательно и в большинстве случаев совершенно никак не уменьшит сложность.[spoiler title="Листинг"]
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;
[/spoiler]
[spoiler title="Немного про качество кода"]Вставлю ещё свои пять копеек по коду в целом. Крайне желательно избегать транслитерации при именовании переменных. Также не помешает немного изменить дизайн БД, например, поменять тип данных Sex на заранее определённый enum в соответствии со стандартом ISO. Также лучше разделить ФИО на отдельные свойства, т.к. ФИО всегда можно собрать из частей, но разложить возможно не всегда.
[/spoiler]
Приветствую.
Самый простой способ – создать анонимный тип из 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;
Цитата: Иван от 03.09.2022, 16:01Цитата: Dapofig от 03.09.2022, 00:56Приветствую.
Самый простой способ – создать анонимный тип из Select запроса. В идеале, добавить отдельную ViewModel для выборки. Привязывать сущности EF напрямую к UI очень нежелательно и в большинстве случаев совершенно никак не уменьшит сложность.[spoiler title="Листинг"]
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" />[/spoiler]
[spoiler title="Немного про качество кода"]Вставлю ещё свои пять копеек по коду в целом. Крайне желательно избегать транслитерации при именовании переменных. Также не помешает немного изменить дизайн БД, например, поменять тип данных Sex на заранее определённый enum в соответствии со стандартом ISO. Также лучше разделить ФИО на отдельные свойства, т.к. ФИО всегда можно собрать из частей, но разложить возможно не всегда.
[/spoiler]Спасибо Вам большое!
Прислушаюсь к Вам и сделаю так как советуете, так как на самом деле это всё звучит проффесионально и логично.
Очень рад, что поделились опытом. Ещё раз спасибо большое!
Цитата: 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. Также лучше разделить ФИО на отдельные свойства, т.к. ФИО всегда можно собрать из частей, но разложить возможно не всегда.
Спасибо Вам большое!
Прислушаюсь к Вам и сделаю так как советуете, так как на самом деле это всё звучит проффесионально и логично.
Очень рад, что поделились опытом. Ещё раз спасибо большое!
[/spoiler]