EF5를 가지고 놀면서 이상한 점을 발견했습니다. 이 두 클래스와 간단한 쿼리가 주어지면
public class Customer {
public string Name { get; set; }
public string Email { get; set; }
...
public virtual IList<Order> Orders { get; set; }
}
public class Order {
public Customer Cust { get; set; }
public Datetime DateOrdered { get; set; }
...
}
using (var ctx = new DatabaseContext(connstring))
{
Customer c= ctx.customers.Include(x => x.orders).Where(x => x.Id == 1).Single<Customer>();
foreach (Order o in c.orders)
{
Console.WriteLine(o.ToString());
}
}
SQL Server Profiler 출력을 확인했는데 쿼리가 불필요하게 복잡하다고 생각합니다.
SELECT
[Project1].[Id] AS [Id],
[Project1].[name] AS [name],
[Project1].[C1] AS [C1],
[Project1].[Id1] AS [Id1],
[Project1].[customer_Id] AS [customer_Id],
[Project1].[timeordered] AS [timeordered]
FROM ( SELECT
[Limit1].[Id] AS [Id],
[Limit1].[name] AS [name],
[Extent2].[Id] AS [Id1],
[Extent2].[customer_Id] AS [customer_Id],
[Extent2].[timeordered] AS [timeordered],
CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
FROM (SELECT TOP (2) [Extent1].[Id] AS [Id], [Extent1].[name] AS [name]
FROM [dbo].[Customers] AS [Extent1]
WHERE 1 = [Extent1].[Id] ) AS [Limit1]
LEFT OUTER JOIN [dbo].[Orders] AS [Extent2] ON [Limit1].[Id] = [Extent2].[customer_Id]
) AS [Project1]
ORDER BY [Project1].[Id] ASC, [Project1].[C1] ASC
내가 뭔가를 놓치고 있다고 확신하지만 무엇을 모르거나 eager loading의 정상적인 동작입니까?
그것은 정상입니다. 간단한 경우 (1 포함)에서 실제 쿼리를 하위 쿼리로 수행하는 EF를 확인한 다음이를 선택하고 순서를 적용합니다.
단일 쿼리에 더 많은 포함을 포함하려고하면 엔터티 당 단일 쿼리를 수행 한 다음 쿼리를 모두 "결합"하고 마지막으로 결과를 선택하기 때문에 동작이 변경되는 것을 볼 수 있습니다.
내 경험상 EF의 열렬한 로딩은 거의 항상 성능 저하를 가져 오기 때문에 특정 요구 사항이 있고 성능 영향을 깊이 고려하지 않는 한 피하는 것이 좋습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다