Производительность - получить данные через свойство навигации или скомпилированный запрос

Я скомпилировал запросы для обоих, основной объект 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();

В остальных случаях предпочитают ленивую загрузку.

Другие вопросы по тегам