0

Я скомпилировал запросы как для основного объекта customer, так и для связанных объектов (заказов).Производительность - получить данные через свойство навигации vs скомпилированный запрос

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 неактивных заказов).

Какой из этих двух будет иметь лучшую производительность?

я не мог полностью понять это related question

ответ

0

Linq к 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); 

Что вы делаете здесь просто получить клиента с определенным Id первым. (Постоянная и не зависит от графа Орденов вы запрос)

Тогда вы запрашиваете заказы этого клиента (этот запрос зависимого от на сколько заказов этого клиента есть):

var customerOrders = customer.Orders.where(o => o.IsActive).ToList(); 

Тогда вам выполните другой запрос, который приведет к тому же самому оператору SQL, что и выше.

var customerOrders = MyService.GetOrders<Order>().where(o => o.CustomerId == fooId && o.IsActive).ToList(); 

Именно поэтому разница в производительности - это только первый запрос.

+0

Так что запрос свойства навигации лучше, чем выполненный запрос в этом случае? – ManirajSS

+0

Я не полностью понимаю, что вы подразумеваете под скомпилированным запросом. Однако Linq to Entities предоставляет лишь небольшое количество поддерживаемых функций. Если вы превысите те, которые потребуются для получения большего объема данных из базы данных, тогда выполните вычисления и возможное сокращение с полными данными, которые затем снижают производительность. Посмотрите здесь https://msdn.microsoft.com/en-us/library/bb738550.aspx –

+0

, например, если вы используете некоторое Regex для фильтрации ваших данных, которые вам нужно будет вызвать, например .ToList() или .AsEnumerable (), который отправит SQL-запрос в базу данных и скопирует набор результатов в объекты. Затем вы можете использовать Linq для объектов для фильтрации на основе Regex –

0

Ваш путь зависит от вашего дела. если вы собираетесь активно использовать связанные объекты: Лучший способ включить это в запросе:

using System.Data.Entity; 
... 
var customer = MyService.GetCustomer<Customer>().where(c => c.Id == fooId).Include(u => u.Orders).ToList(); 

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

+0

Так что запрос свойства навигации не дает какого-либо улучшения производительности, чем скомпилированный запрос? – ManirajSS

+0

http://stackoverflow.com/questions/19319116/include-vs-load-performance-in-entityframework - приятное объяснение –