EF là tạo SQL khác nhau cho cho hai câu lệnh tương tự như liệt kê dưới đâyEF SQL thay đổi khi đi qua vị như Parameter để ở đâu khoản
var test = dbcontext.Persons.GetAll()
.Where(c => c.PersonID == 2)
.Select(c => c.PersonName)
.FirstOrDefault();`
SQL tạo:
SELECT
[Limit1].[PersonName ] AS [PersonName ]
FROM
(SELECT TOP (1)
[Extent1].[PersonName ] AS [PersonName ]
FROM
[dbo].[ApplicationRequest] AS [Extent1]
WHERE
[Extent1].[PersonID ] = @p__linq__0) AS [Limit1]',N'@p__linq__0 uniqueidentifier',@p__linq__0= "2"
Tôi đang sử dụng những điều khoản trên tại nhiều nơi có điều kiện khác nhau Where
; để củng cố logic trong một nơi tôi đi qua tình trạng này như một tham số
Public Void PassPredicate(Func<ApplicationRequest, bool> ReqFunc)
{
var test = dbcontext.Persons.GetAll()
.Where(ReqFunc)
.Select(c => c.PersonName)
.FirstOrDefault();
}
tôi kêu gọi các chức năng như
PassPredicate(c => c.PersonID == 2);
tạo SQL:
SELECT
[Extent1].[PersonID] AS [PersonID],
[Extent1].[PersonName ] AS [PersonName ],
[Extent1].[DOB] AS [Dob],
[Extent1].[Height] AS [Height],
[Extent1].[BirthCity] AS [BirthCity],
[Extent1].[Country] AS [Country],
FROM
[dbo].[Person] AS [Extent1]
Nếu bạn nhìn vào thứ hai SQL, nó khá đáng báo động: nó đang kéo tất cả thông tin (cột và hàng). Nó không có mệnh đề where và chọn tất cả các cột.
Điều kiện ở đâu đang được áp dụng sau khi kết quả được trả về từ DB.
Sự khác biệt duy nhất trong câu lệnh thứ hai là tôi đang chuyển điều kiện làm tham số thay vì có điều kiện bên trong mệnh đề where.
Bất cứ ai có thể giải thích lý do tại sao sự khác biệt?
'var test = dbcontext.Persons.GetAll(). Ở đâu (c => c.PersonID == 2) .Chọn (c => c.PersonName) .irstOrDefault();' tại sao bạn không sử dụng câu lệnh đơn giản như 'var test = dbcontext.Persons.FirstOrDefault (c => c.PersonID == 2) .Chọn (c => c.PersonName);' –
Tôi bị ràng buộc một chút khi sử dụng ngoài GetALL. Thực ra chúng tôi không sử dụng chính xác cú pháp .. chúng tôi đang sử dụng một cái gì đó giống như PersonsRepository.GetAll() ... Kho lưu trữ chỉ hiển thị các chức năng giới hạn –
oky nhưng tôi nghĩ rằng nó sử dụng thêm tài nguyên. –