Chỉ cần tự mình điều hành. Trong trường hợp của tôi, vấn đề là truy vấn có một mệnh đề .Select() gây ra các mối quan hệ khác được thiết lập mà cuối cùng sẽ lọc truy vấn thêm khi mối quan hệ bên trong kết nối hạn chế kết quả.
Dường như .Count() không xử lý phần .Select() của truy vấn.
Vì vậy, tôi có:
// projection created
var ordersData = orders.Select(ord => new OrderData() {
OrderId = ord.OrderId,
... more simple 1 - 1 order maps
// Related values that cause relations in SQL
TotalItemsCost = ord.OrderLines.Sum(lin => lin.Qty*lin.Price),
CustomerName = ord.Customer.Name,
};
var count = ordersData.Count(); // 207
var count = ordersData.ToList().Count // 192
Khi tôi so sánh các câu lệnh SQL Tôi tìm Đếm rằng() thực hiện một SUM rất đơn giản trên bảng Orders mà trả về tất cả các đơn đặt hàng, trong khi truy vấn thứ hai là một con quái vật của 100 + Các dòng của SQL có 10 kết nối bên trong được kích hoạt bởi mệnh đề .Select() (có thêm một vài giá trị liên quan/tập hợp được lấy ra được hiển thị ở đây). Về cơ bản, điều này dường như chỉ ra rằng .Count() không nhận mệnh đề .Select() khi nó đếm, vì vậy những mối quan hệ tương tự gây ra sự ràng buộc hơn nữa của tập kết quả không được kích hoạt cho .Count().
Tôi đã có thể làm cho công việc này bằng cách thêm một cách rõ ràng biểu cho phương thức Count() mà kéo trong một số những giá trị kết quả tổng hợp mà hiệu quả buộc họ vào Count() truy vấn cũng như:
var count = ordersData.Count(o=> o.TotalItemsCost != -999 &&
o.Customer.Name != "[email protected]#"); // 207
Điều quan trọng là đảm bảo rằng bất kỳ trường nào được tính toán hoặc kéo dữ liệu liên quan và gây ra mối quan hệ với lửa, được bao gồm trong biểu thức buộc Count() bao gồm các mối quan hệ được yêu cầu trong truy vấn của nó.
Tôi nhận ra đây là một tổng số hack và tôi hy vọng có một cách tốt hơn, nhưng hiện tại điều này đã cho phép chúng tôi ít nhất để có được giá trị đúng mà không cần kéo dữ liệu lớn xuống .ToList() trước.
Nguồn
2013-09-26 04:45:20
efQuery có thể đếm được hoặc có thể truy xuất được không? Ngoài ra, nếu bạn có thể đăng mã thực sự của mình để có thể trợ giúp. – Maess
efQuery là 'IQueryable', nó là một truy vấn chưa được thực thi đối với cơ sở dữ liệu. Tôi đã thêm mã. – ReFocus