2015-04-24 17 views
5

Tôi đang cố gắng hiểu tại sao lại tham gia vào trường hợp của tôi nhanh hơn tuyên bố sử dụng thuộc tính điều hướng. Tôi có hai truy vấn.Thực hiện khung thực thể tham gia vs thuộc tính điều hướng

đầu tiên với bất động sản chuyển hướng:

  var result = (from users in context.MetricBloodPreasure 
       orderby users.User.LastName, users.User.FirstName 
       select new 
       { 
        UserName = users.User.LastName + ", " + users.User.FirstName, 
        Date = users.DateOfValue, 
       }).ToList(); 

Generatet sql:

SELECT 
    [Project1].[C1] AS [C1], 
    [Project1].[C2] AS [C2], 
    [Project1].[DateOfValue] AS [DateOfValue] 
    FROM (SELECT 
     [Extent1].[DateOfValue] AS [DateOfValue], 
     [Extent2].[FirstName] AS [FirstName], 
     [Extent2].[LastName] AS [LastName], 
     1 AS [C1], 
     CASE WHEN ([Extent2].[LastName] IS NULL) THEN N'' ELSE [Extent2].[LastName] END + N', ' + CASE WHEN ([Extent2].[FirstName] IS NULL) THEN N'' ELSE [Extent2].[FirstName] END AS [C2] 
     FROM [dbo].[MetricBloodPreasure] AS [Extent1] 
     INNER JOIN [dbo].[User] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[Id] 
    ) AS [Project1] 
    ORDER BY [Project1].[LastName] ASC, [Project1].[FirstName] ASC 

Thứ hai với tham gia:

var result1 = (from u in context.User 
       orderby u.LastName, u.FirstName 
       join us in context.MetricBloodPreasure 
        on u.Id equals us.UserId into users 
       from s in users 
       select new 
       { 
        UserName = s.User.LastName + ", " + s.User.FirstName, 
        Date = s.DateOfValue, 
       }).ToList(); 

tạo sql:

SELECT 
    1 AS [C1], 
    CASE WHEN ([Extent1].[LastName] IS NULL) THEN N'' ELSE [Extent1].[LastName] END + N', ' + CASE WHEN ([Extent1].[FirstName] IS NULL) THEN N'' ELSE [Extent1].[FirstName] END AS [C2], 
    [Extent2].[DateOfValue] AS [DateOfValue] 
    FROM [dbo].[User] AS [Extent1] 
    INNER JOIN [dbo].[MetricBloodPreasure] AS [Extent2] ON ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent2].[UserId] = [Extent1].[Id]) 

Trước khi chạy truy vấn đầu tiên, hãy gọi var user = context.User.FirstOrDefault(); vì tôi nghĩ rằng kết nối mở với cơ sở dữ liệu mất một thời gian.

Kết quả: Navigation truy vấn bất động sản: 00: 00: 00,6719646 Tham gia truy vấn: 00: 00: 00,4941169

Nhìn vào kết quả có vẻ như LINQ truy vấn sử dụng mà tham gia thay vì tài sản chuyển hướng nhanh hơn. Điều đó đúng hay tôi đang làm gì đó sai?

+0

Bạn cũng cần xóa bộ nhớ cache khỏi cơ sở dữ liệu giữa các truy vấn để nhận được kết quả phù hợp như bạn đang gọi ToList(). Tách biệt cấu trúc truy vấn từ hiện thực hóa và điểm chuẩn. –

+0

OrderBy dường như không được tính đến trong truy vấn thứ hai. Điều này có thể là nguyên nhân của sự khác biệt, Bạn có thể thử '... từ s trong người dùng orderby u.LastName, u.FirstName ...' – jbl

Trả lời

2

Để hiểu rõ hơn về những gì bạn đang làm, bạn sẽ nhận được SQL thô và bạn có thể tự mình kiểm tra kế hoạch thực hiện.

Để làm điều này, bạn có thể sử dụng SQL Profiler để xem những gì truy vấn đang được chạy, hoặc bạn có thể đăng nhập truy vấn SQL bản thân bằng cách làm một cái gì đó như thế này trước khi bạn chạy truy vấn của bạn:

context.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

Cũng làm một điểm chuẩn đơn giản như bạn đã làm bằng cách chạy mỗi một lần sẽ không nhất thiết phải đáng tin cậy. Bạn sẽ muốn chạy nó nhiều lần và những thứ trung bình. Bạn cũng nên chạy chúng theo thứ tự ngược lại để xem điều đó có thay đổi mọi thứ không.

+0

Hơn nữa chèn thêm dữ liệu vào cơ sở dữ liệu là ý tưởng tốt, điều này sẽ làm nổi bật sự khác biệt (nếu tồn tại) –

+0

cả hai truy vấn trả lại trên 9000 hàng ... và có tôi sử dụng nhật ký và chạy truy vấn với trường hợp mới của bối cảnh cơ sở dữ liệu của tôi. Tham gia vẫn nhanh hơn. – puko

+0

Bạn có thể đăng SQL đang được chạy vào câu hỏi gốc không? Ngoài ra, bạn có chạy SQL trong SSMS và bật kế hoạch thực hiện để bạn có thể thấy sự khác biệt ở đâu không? –

Các vấn đề liên quan