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

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

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 для какого-либо запроса к базе данных?

Ответы [ 2 ]

7 голосов
/ 29 января 2010

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

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

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

db.Log = Console.Out;

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

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

1 голос
/ 29 января 2010

Просто к сведению, кроме отложенной загрузки, есть еще одна причина, по которой активность базы данных может не происходить, когда вы ожидаете этого при использовании 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 знает, что нужно извлечь не более одной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...