У меня есть вопрос относительно того, каковы лучшие практики создания объекта ViewModel с использованием каркаса сущностей.
Я знаком с отложенной и активной загрузкой и буду использовать все, что соответствует сценарию.
В случае, который я сейчас рассматриваю, у меня есть объект базы данных со свойствами навигации, где он может быть нулевым. Но если значение не равно NULL, извлеките из него некоторые значения с помощью навигации.
Я пробовал два разных запроса:
1) Сначала получает все данные в память с помощью выполнив ToList, затем сгенерируйте виртуальную машину, выбрав SELECTING и выполнив операторы C#, такие как пропаганду null.
2) Сначала вызовите оператор SELECT и используйте запросы к базе данных, такие как проверка, если значение равно NULL, и нет, получить значение, затем выполнить ToList.
Два фрагмента кода выглядят следующим образом:
1) Начать загрузку, сначала вызвав ToList, а затем выбрав виртуальную машину с использованием нулевого пропагатора .
var items = db.Items
.Include("NavigationProperty")
.Where(a => a.IsDeleted == false)
.ToList()
.Select(b => new ItemViewModel
{
ItemId = b.ItemId,
...
NavigationPropertyId = b.NavigationPropertyId,
**NavigationPropertyName = b.NavigationProperty?.Name**
})
.OrderBy(c => c.ItemName)
.ToList();
2) Сначала выберите виртуальную машину с помощью условного нуля, а затем вызовите ToList.
var items = db.Items
.Include("NavigationProperty")
.Where(a => a.IsDeleted == false)
.Select(b => new ItemViewModel
{
ItemId = b.ItemId,
...
NavigationPropertyId = b.NavigationPropertyId,
**NavigationPropertyName = b.NavigationProperty != null
? b.NavigationProperty.Name
: null**
})
.OrderBy(c => c.ItemName)
.ToList();
Как и ожидалось в Server Profiler, первая опция переносит все объекты в память. сначала, затем C# выполняет то, что ему нужно, тогда как второй вариант будет выполнять операции в рамках запроса SQL, который он отправляет в БД.
Из-за небольших данных Подмножество, с которым я работаю, SQL сервер обеспечивает очень небольшую разницу, глядя на статистику клиента, с той лишь разницей, что, как и ожидалось, в плане запросов.
Для любых случаев, когда у вас есть небольшое количество данных (скажем, менее 1000), это может не иметь большого значения, так как система будет достаточно быстрой, чтобы справиться с ней в любом случае (либо в памяти сервера, либо в запросе SQL). Но как это изменится, когда мы попадем во множество областей данных, таких как более 10000 возвращаемых записей.
Может быть много зависимостей, например, насколько хорошо оптимизирован индекс базы данных с внешними ключами и другими индексами, и будет ли ответ изменяться в зависимости от того, насколько хорошо оптимизирована база данных?
Вопросы:
Лучше всего попробовать выбрать из вашей ViewModel, используя SQL
или получить все данные с помощью Сначала перейдите к памяти, а затем выберите ее в ViewModel?
Расширяя этот вопрос, скажем, у нас есть таблица с 500 000 записей (с включенной навигацией), и существует сторонняя организация MVC расширение, которое выполняет для вас серверные операции, такие как разбиение на страницы, фильтрация и сортировка (это предполагает, что он также выполняет запросы LINQ для вас, чтобы получить такие данные.
Расширенный вопрос:
Лучше ли разрешать стороннему расширению выполнять операции над самой базой данных (что даст преимущества от pagi?) ng только извлекает (например, первые 200 записей для первой страницы, но за счет «необходимости» выполнения SQL операций запроса)
или для передачи данных в ваш памяти, сначала выполняя ToList, а затем используя расширение в списке извлеченных данных (что дает преимущество, просто вызывая все элементы в памяти с использованием «относительно простого» плана запросов, а затем выполняя действия в C#, но на за счет необходимости каждый раз получать 500 000 единиц товара)?