2010-01-28 1 views
2

Я хочу улучшить свои запросы, но не смог найти ресурс, который выдается, когда запрос отправляется в дб.В какой точке linq-to-sql или linq отправляет запрос в базу данных

DBContext db = new DBContext(); 
Order _order = (from o in db 
       where o.OrderID == "qwerty-asdf-xcvb" 
       select o).FirstOrDefault(); 
String _custName = _order.Customer.Name +" "+_order.Customer.Surname; 

Требуется ли назначение _custName для любого запроса в базу данных?

+0

любые ссылки на ресурсы также будут оценены. – Kieran

ответ

7

Задать вопрос о запросе _custName сделать запрос к базе данных?

Это зависит от того, стоит ли загрузить Order.Customer. Если он лениво загружен, то да. В противном случае нет.

Кстати, вы можете исследовать это легко, если вы установите DataContext.Log свойство:

db.Log = Console.Out; 

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

Проверьте MSDN на Deferred versus Immediate Loading. В частности, вы можете turn off lazy loading. Остерегайтесь SELECT N + 1 problem.

1

Просто FYI, кроме ленивой загрузки, есть еще одна причина, по которой активность базы данных может не произойти, когда вы ожидаете ее при использовании LINQ. Например, если я немного изменить пример кода:

DBContext db = new DBContext(); 
var orders = (from o in db 
      where o.OrderID == "qwerty-asdf-xcvb" 
      select o); 
var order = orders.FirstOrDefault(); 
String _custName = _order.Customer.Name +" "+_order.Customer.Surname; 

Кто незнаком с тем, как работает LINQ можно ожидать, что все заказы извлекаются из базы данных при второй строке кода выполняется. На самом деле LINQ задерживает запрос базы данных до последнего момента, который в этом случае является вызовом FirstOrDefault. Конечно, на данный момент LINQ знает, как получить только одну запись.