Итак, что вы все видите в последовательной практике?
Они оба существуют по определенной причине, они оба полезны, когда другого нет.Вы всегда будете тесно связаны с таблицей в стране 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) ...