Производительность - получить данные через свойство навигации или скомпилированный запрос
Я скомпилировал запросы для обоих, основной объект customer
и для связанных лиц (заказов).
var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).ToList();
var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList();
Но я думаю, что я могу получить все заказы через свойства навигации вместо вызовов скомпилированных запросов, так как customer
уже загружен в память с помощью кода ниже:
var customerOrders = customer.Orders.where(o => o.IsActive).ToList(); // I didn't do filter further more
Но когда я измерил сроки, я не смог найти значительной разницы (у БД 500 клиентов и 4000 заказов. И у каждого конкретного клиента есть 30 активных заказов и около 400 неактивных заказов).
Какой из этих двух будет иметь лучшую производительность?
Я не мог полностью понять этот связанный вопрос
2 ответа
Linq to Entities переводит запросы Linq в SQL.
var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).ToList();
Это на самом деле можно упростить, поскольку c.Id уникален:
Customer customer = MyService.GetCustomer<Customer>().SingleOrDefault(c=> c.Id == fooId);
То, что вы делаете здесь, это просто получите клиента с определенным идентификатором в первую очередь. (постоянный и не зависит от количества заказов, которые вы запрашиваете)
Затем вы запрашиваете заказы этого клиента (этот запрос зависит от того, сколько заказов у этого клиента):
var customerOrders = customer.Orders.where(o => o.IsActive).ToList();
Затем вы делаете еще один запрос, который приведет к тому же оператору SQL, что и приведенный выше.
var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList();
Вот почему разница в производительности - это только первый запрос.
Вы в зависимости от вашего случая. если вы собираетесь активно использовать связанные объекты: лучше всего включить это в ваш запрос:
using System.Data.Entity;
...
var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).Include(u => u.Orders).ToList();
В остальных случаях предпочитают ленивую загрузку.