Фильтрация данных с помощью моделей данных объектов MVC3 и ADO.NET - PullRequest
1 голос
/ 03 февраля 2012

Я создал таблицу с именем Orders в моей базе данных SQL Server 2008. В этой таблице есть столбцы, которые включают dateCreated типа Date, CustomerId, InvoiceTypeId, InvoiceId и т. Д. У меня также есть таблицы Invoice, Customer и InvoiceType.

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

В моем проекте MVC3 Visual Studio я создал модель данных объекта ADO.NET для представления представления БД. Я также создал очень простой контроллер. Наконец, я создал вид бритвы с WebGrid для отображения моих заказов. Работает нормально.

Это разумный подход?

Допустим, теперь я хочу добавить на свою страницу бритвы возможность добавить дату начала и дату окончания, которые можно использовать для фильтрации содержимого WebGrid, как я могу это сделать?

Полагаю, есть два способа сделать это.

  1. Загрузить все данные из представления БД в модель сущности. Тогда код фильтрации будет добавлен, возможно, в код бритвы. БД не нужно читать каждый раз при смене фильтра, поскольку все данные уже есть в модели.

  2. добавить в просмотр базы данных дополнительный код SQL, что-то вроде WHERE (dateCreated BETWEEN @StartDate AND @EndDate) , а затем каждый раз, когда мы меняем фильтр, читаем модель из базы данных. Это было бы хорошо, если в таблице «Заказы» имеется большое количество записей, и мы обычно заинтересованы только в просмотре, возможно, за последнюю неделю или несколько дней. Возможно ли это сделать с помощью подхода MVC3? Как это можно сделать?

1 Ответ

2 голосов
/ 03 февраля 2012

Я бы не рекомендовал ваш подход.Ваш просмотр базы данных является только проекцией.Вы можете делать прогнозы с LINQ.С LINQ вы можете делать различные проекции, и они просты в обслуживании.

1) Загрузите все данные из представления БД в модель объекта.Тогда код фильтрации будет добавлен, возможно, в код бритвы.БД не нужно читать каждый раз при смене фильтра, поскольку все данные уже есть в модели.

Рекомендуемый подход заключается в построении запроса LINQ на основе критериев фильтра и столбцов.Вы хотите отобразить.Фильтрация будет осуществляться в базе данных.Позвольте базе данных делать то, что она умеет лучше всего (Фильтрация), и пусть Razor делает то, что умеет хорошо (Презентация).

2) добавляет к представлению БД некоторый дополнительный код SQL, что-то вроде WHERE (dateCreated)МЕЖДУ @StartDate AND @EndDate), а затем каждый раз, когда мы меняем фильтр, читаем модель из БД.Это было бы хорошо, если в таблице «Заказы» имеется большое количество записей, и мы обычно заинтересованы только в просмотре, возможно, за последнюю неделю или несколько дней.Возможно ли это сделать с помощью подхода MVC3?Как это можно сделать?

И снова фильтры даты могут применяться с использованием LINQ, и фильтрация будет выполняться в базе данных.

Пример кода

var query = db.Invoices;

if (!string.IsNullOrWhiteSpace(model.CustomerName))
{
     query = query.And(i => i.Customer.Name.StartsWith(model.CustomerName));
}

if (model.InvoiceTypeId != null)
{
     query = query.And(i => i.InvoiceTypeId == model.InvoiceTypeId.Value);
}

return query.Select(i => new InvoiceDto { i.Amount, Customer = i.Customer.Name });
...