в какой момент linq-to-sql или linq отправляет запрос в базу данных

2

Я хочу улучшить свои запросы, но не смог найти ресурс, который выдается, когда запрос отправляется в 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 для любого запроса в базу данных?

  • 0
    Любые ссылки на ресурсы также будут оценены.
Теги:
linq
linq-to-sql

2 ответа

7
Лучший ответ

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

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

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

db.Log = Console.Out;

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

Проверьте MSDN на Отложенная и немедленная загрузка. В частности, вы можете отключить ленивую загрузку. Остерегайтесь проблемы SELECT N + 1.

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 знает, что извлекает не более одной записи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню