Я хочу улучшить свои запросы, но не смог найти ресурс, который выдается, когда запрос отправляется в db.
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 для любого запроса в базу данных?
Требуется ли назначение
_custName
сделать любой запрос в базу данных?
Это зависит от того, загружена ли или нет Order.Customer
. Если он лениво загружен, то да. В противном случае нет.
Кстати, вы можете легко изучить это, если вы установите свойство DataContext.Log
:
db.Log = Console.Out;
Затем вы можете посмотреть инструкции SQL на консоли. Посредством вашей программы вы можете точно видеть, когда оператор SQL попадает в базу данных.
Проверьте MSDN на Отложенная и немедленная загрузка. В частности, вы можете отключить ленивую загрузку. Остерегайтесь проблемы SELECT N + 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 знает, что извлекает не более одной записи.