2010-01-28 3 views
2

내 쿼리를 더 좋게 만들고 싶지만 질의가 전달 될 때 리소스를 찾을 수 없습니다. db.어느 시점에서 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이 느리게로드되는지 여부에 따라 달라집니다. 느슨하게로드 된 경우 예. 그렇지 않으면 아니오.

db.Log = Console.Out; 

그런 다음 콘솔에 SQL 문을 볼 수있다 : 당신이 DataContext.Log 속성을 설정하면 그런데

, 당신은 쉽게를 조사 할 수 있습니다. 프로그램을 단계별로 실행하면 SQL 문이 데이터베이스에 도달하는시기를 정확히 볼 수 있습니다.

MSDN (Deferred versus Immediate Loading)을 확인하십시오. 특히 turn off lazy loading 수 있습니다. SELECT N + 1 problem에주의하십시오.

1

지연로드 외에도 LINQ를 사용할 때 데이터베이스 활동이 발생할 수없는 또 다른 이유가 있습니다. 예를 들어, 나는 약간의 예제 코드를 변경하는 경우 : 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는 마지막 순간까지 데이터베이스 쿼리를 지연합니다.이 경우 FirstOrDefault에 대한 호출입니다. 물론 LINQ는이 시점에서 최대 하나의 레코드 만 검색한다는 것을 알고 있습니다.

관련 문제