Извлечение таблицы данных по имени столбца или целому числу - PullRequest
0 голосов
/ 13 ноября 2018

Итак, я просто искал здесь общее правило и не мог найти законный метод для продвижения вперед. Я часто вижу оба.

По сути, у вас есть что-то вроде этого:

DataTable dt = new DataTable();
dt blah blah blah .Fill

Теперь доступ:

dt.Rows[i]["ColumnName"].ToString();
dt.Rows[i][ColumnInteger].ToString();

Итак, вопрос в том, я вижу достоинства обоих. Изменение имени столбца в таблице однажды не будет иметь никакого эффекта, если мы будем использовать целое число. С той же стороны, использование названия столбца определенно проще с точки зрения читабельности. Или, может быть, есть причина выбирать одно из другого с точки зрения производительности.

Так на самом деле, что вы все видите в последовательной практике?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Итак, что вы все видите в последовательной практике?

Они оба существуют по определенной причине, они оба полезны, когда другого нет.Вы всегда будете тесно связаны с таблицей в стране SQL.Это просто ваш выбор, если вы хотите связать его через индекс столбца или строку.

На практике я никогда не проектировал систему для использования таблиц данных.У меня строго типизированный объектно-ориентированный язык , поэтому я решил использовать объекты над общими контейнерами данных.

Существуют ORM фреймворки, такие как Entity Framework (microsoft), Dapper , NHibernate и более, которые позволяют вашей строке базы данных (узлы XML, объект Json и т. Д.) Представлять объект .net (определенный, анонимный и иногда кортежи).Цель состоит в том, чтобы взять данные из системы хранения и преобразовать ваш запрос в класс.После извлечения данных

Таблица данных может выглядеть следующим образом:

[1]Id     [2]FirstName         [3]LastName
(int)     (string)              (string)
--------------------------------------------
1         Erik                  Philips

Таким образом, вычисление Полного имени становится кодом, который выглядит следующим образом:

var fullName = $"{dt.Rows[i][2].ToString()} {dt.Rows[i][3].ToString()}";

или

var fullName = $"{dt.Rows[i]["FirstName"].ToString()} {dt.Rows[i]["LastName"].ToString()}";

Что делает свою работу, но логика в объектно-ориентированном языке должна быть инкапсулирована.Используя ORM, ваши данные запрашиваются через класс, который представляет доступ к данным и настроен на получение данных и их отображение (что я не буду вдаваться в подробности о специфике).Сначала вы создаете POCO :

public class Person
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

, а затем запрашиваете их через класс доступа к данным;

Entity Framework (DbContext)

var person = DbContext.Persons.FirstOrDefault(p => p.id == 1);
// OR
var person = DbContext.Set<Person>().FirstOrDefault(p => p.id == 1);

Dapper: (* Я не использовал dapper, так что это может быть технически неправильно, но вы поняли)

var person = connection.Query<Person>("Select * FROM CUSTOMERS WHERE Id = 1").FirstOrDefault()

NHibernate:

var person = session.Get<Person>(Id);

Во всех этихэкземпляры вы возвращаете класс / объект Person.Теперь мы можем инкапсулировать бизнес-логику (нам нужен последовательный способ представления «полного имени» нашим потребителям данных).

public class Person
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public DateTime BornOn { get; set; }
  public boolean IsMarried { get; set; }
  public string FullName 
  {
    get 
    {
     return $"{FirstName} {LastName}";
    }
  }
}

но является ли это главной целью всего этого?

По моему личному мнению, цель всего этого состоит в том, чтобы помочь разработчику написать хороший код, который включает (пункты, относящиеся к вопросу, который я прокомментирую);

с использованием твердых принципов :

S принцип единой ответственности

// What else could this class possibly be used for?
public class Person ....

Написание читаемого кода с помощью asкак можно меньше документации .

var tom = dbContext.Persons.FirstOrDefault(p => p.FirstName == "Tom");

if (tom.IsMarried) ...

if (tom.BornOn > DateTime.Now) ...
0 голосов
/ 13 ноября 2018

Это не ответит на вопрос «каков правильный путь», но если вы хотите сохранить удобочитаемость при использовании индексов, вы можете создать enum:

enum ColumnNames
{
  FirstName = 1,
  LastName =2, 
}

dt.Rows[i][(int)ColumnNames.FirstName].ToString();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...