Bạn có chắc chắn truy vấn thứ hai của mình thực sự ổn không?
1) Id =d.Id, <=Tại sao lại là dấu phẩy (không thực sự quan trọng)? ('ID =' là thừa)
2) .Where (m => m.Trash ==false) <='Trash' không được chọn, vì vậy thuộc tính này không được biết tại thời điểm này
3) .OrderByDescending (f => f.Create) <=idem cho 'Đã tạo'
4) Tại sao lại có dấu phẩy sau .ToList ()?
Tôi đã đơn giản hóa DDL của bạn (không phải là MWE) với dữ liệu được tạo. Tôi đã tái tạo sự cố của bạn trong VS2013.
Tôi cũng đã kiểm tra truy vấn của bạn với LINQPad trực tiếp trên cơ sở dữ liệu và tôi gặp vấn đề tương tự với lần kiểm tra thứ ba, có thể là lỗi trong trình điều khiển mysql:
trdposts.Select(a => new {
Created = a.Created,
Body = a.Body,
Comments = a.Posttrdcomments
.Select(d => new { Body = d.body, Id = d.Id, d.Created, d.Trash})
.Where(m => m.Trash == 1)
.OrderByDescending(f => f.Created)
.Skip(33)
.Take(10)
.ToList()
})
Đưa ra một truy vấn SQL ngắn hơn:
SELECT t1.PostId, t1.body, t1.Id, t1.Created, t1.Trash
FROM trdposts AS t0
OUTER APPLY (
SELECT t2.body, t2.Created, t2.Id, t2.PostId, t2.Trash
FROM trdcomments AS t2
WHERE ((t2.PostId = t0.Id) AND (t2.Trash = 1))
ORDER BY t2.Created DESC
) AS t1
ORDER BY t1.Created DESC
Nếu không có .Skip () và .Take (), chúng ta sẽ có 'LEFT OUTER JOIN' tốt