Использование ASP.NET MVC без ORM
-
03-07-2019 - |
Вопрос
В моем приложении ASP MVC я использую стандартный SQL (а не Linq to SQL или другой ORM) для запросов к моей базе данных. Р>
Я хотел бы передать результаты базы данных в мое представление и перебрать результаты в моем представлении. Но я не уверен, как это сделать. Каждый пример, который я видел, передает некоторую строку или использует L2S. Я хотел бы передать что-то вроде вложенных Hashtables, но единственное, о чем я могу думать, это передать объект SqlDataReader в представление, но это звучит как очень плохая идея.
Как мне показать результаты своей базы данных из стандартного запроса SQL в моем представлении? Мне бы очень хотелось использовать Linq или другой ORM, но требования диктуют, что мы этого не делаем (не спрашивайте меня, почему, я не понимаю). Я делаю это в VB. Я постараюсь преобразовать любые предоставленные примеры C #.
Решение
Вы можете создать простые классы для данных, которые вы хотите передать, а затем вручную заполнить список объектов в вашем контроллере из устройства чтения данных, а затем передать его в свой View - например, (C #, но это должно быть легко конвертировать)
// open your connection / datareader etc.
List<Customer> customers = new List<Customer>();
while(dataReader.Read())
{
Customer c = new Customer();
c.Id = dataReader.GetInt32(0);
c.Name = dataReader.GetString(1);
// etc (you might want to use string indexers instead of ints for the get methods)
customers.Add(c);
}
// close and dispose your datareader / connection etc as usual
return View("List", customers);
Другие советы
MVC о разделении интересов. Передача SqlDataReaders, DataTables или любого другого класса, который находится в пространстве имен System.Data, представлению не является хорошей идеей. Вам необходимо определить модель, которая может взаимодействовать с базой данных, и контроллер, который передаст эту модель в представление. Если политика вашей компании гласит, что не используйте ORM, тогда, возможно, классические веб-формы лучше подходят для вашего сценария, чем шаблон MVC.
Я согласен с Рашаком. В этой статье это объясняется более подробно. текст ссылки р>
Вкратце, вот как это сделать, используя DataTable и DataReader:
private DataTable GetData()
{
DataTable dt = new DataTable();
using (SqlConnection connection
= new SqlConnection("ConnectionString"))
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandText = "SELECT * FROM Customers";
connection.Open();
using (SqlDataReader reader =
command.ExecuteReader
(CommandBehavior.CloseConnection))
{
dt.Load(reader);
}
}
return dt;
}
Затем вы можете прочитать этот DataTable в объект сущности, который вы передаете.
Я думаю, вы обнаружите, что это может дать гораздо лучшую производительность, чем использование Linq или ORM.
Попробуйте использовать DataTables - DataTable может загружать данные из IDataReader ... (я думаю, метод называется Load)
Вы можете создавать свои собственные классы объектов передачи данных и заполнять их экземпляры с помощью ADO. Чистый код. Эти классы DTO будут простыми POCO -стилями, которые просто содержат свойство get / set accessors, нет методы. Использование объектов POCO, возможно, предпочтительнее DataSets / DataTables, поскольку они легки (без лишнего состояния) и более интуитивно понятны для работы с объектно-ориентированной точки зрения.