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?
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. –
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