Lưu ý: Tôi đã viết câu trả lời này khi Entity Framework 4 là thực tế. Điểm của câu trả lời này là không tham gia vào thử nghiệm tầm thường .Any()
so với .Count()
hiệu suất. Vấn đề là báo hiệu rằng EF không hoàn hảo. Các phiên bản mới tốt hơn ... nhưng nếu bạn có một phần mã chậm và sử dụng EF, hãy kiểm tra với TSQL trực tiếp và so sánh hiệu suất thay vì dựa vào các giả định (đó .Any()
là LUÔN nhanh hơn .Count() > 0
).
Mặc dù tôi đồng ý với hầu hết các câu trả lời và bình luận được bình chọn - đặc biệt là về ý định của nhà phát triểnAny
tín hiệu tốt hơn - tôi đã gặp tình huống Count nhanh hơn theo thứ tự cường độ trên SQL Server (EntityFramework 4).Count() > 0
Đây là truy vấn với Any
ngoại lệ hết thời gian chờ (trên ~ 200.000 bản ghi):
con = db.Contacts.
Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
&& !a.NewsletterLogs.Any(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr)
).OrderBy(a => a.ContactId).
Skip(position - 1).
Take(1).FirstOrDefault();
Count
phiên bản được thực hiện trong vấn đề mili giây:
con = db.Contacts.
Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
&& a.NewsletterLogs.Count(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr) == 0
).OrderBy(a => a.ContactId).
Skip(position - 1).
Take(1).FirstOrDefault();
Tôi cần tìm một cách để xem SQL chính xác mà cả hai LINQ tạo ra - nhưng rõ ràng có một sự khác biệt lớn về hiệu năng giữa Count
và Any
trong một số trường hợp, và thật không may là dường như bạn không thể gắn bó Any
trong mọi trường hợp.
EDIT: Đây là các SQL được tạo. Người đẹp như bạn có thể thấy;)
ANY
:
thực hiện sp_executesql N'SELECT TOP (1)
[Project2]. [ContactId] NHƯ [ContactId],
[Project2]. [CompanyId] NHƯ [CompanyId],
[Project2]. [Tên liên hệ] NHƯ [Tên liên hệ],
[Project2]. [Tên đầy đủ] NHƯ [Tên đầy đủ],
[Project2]. [ContactStatusId] NHƯ [ContactStatusId],
[Project2]. [Tạo] NHƯ [Đã tạo]
TỪ (CHỌN [Project2]. [ContactId] AS [ContactId], [Project2]. [CompanyId] AS [CompanyId], [Project2]. [ContactName] AS [ContactName], [Project2]. [FullName] AS [FullName] , [Project2]. [ContactStatusId] AS [ContactStatusId], [Project2]. [Tạo] AS [Tạo], row_number () QUÁ (ĐẶT HÀNG B [NG [Project2]. [ContactId] ASC) AS [row_number]
TỪ (CHỌN
[Extent1]. [ContactId] NHƯ [ContactId],
[Extent1]. [CompanyId] NHƯ [CompanyId],
[Extent1]. [Tên liên hệ] NHƯ [Tên liên hệ],
[Extent1]. [FullName] NHƯ [FullName],
[Extent1]. [ContactStatusId] NHƯ [ContactStatusId],
[Extent1]. [Tạo] NHƯ [Đã tạo]
TỪ [dbo]. [Liên hệ] NHƯ [Extent1]
WHERE ([Extent1]. [CompanyId] = @ p__linq__0) VÀ ([Extent1]. [ContactStatusId] <= 3) VÀ (KHÔNG EXISTS (CHỌN
1 NHƯ [C1]
TỪ [dbo]. [NewsletterLog] NHƯ [Extent2]
WHERE ([Extent1]. [ContactId] = [Extent2]. [ContactId]) VÀ (6 = [Extent2]. [NewsletterLogTypeId])
))
) NHƯ [Dự án2]
) NHƯ [Dự án2]
Ở ĐÂU [Project2]. [Row_number]> 99
ĐẶT HÀNG B [NG [Project2]. [ContactId] ASC ', N' @ p__linq__0 int ', @ p__linq__0 = 4
COUNT
:
thực hiện sp_executesql N'SELECT TOP (1)
[Project2]. [ContactId] NHƯ [ContactId],
[Project2]. [CompanyId] NHƯ [CompanyId],
[Project2]. [Tên liên hệ] NHƯ [Tên liên hệ],
[Project2]. [Tên đầy đủ] NHƯ [Tên đầy đủ],
[Project2]. [ContactStatusId] NHƯ [ContactStatusId],
[Project2]. [Tạo] NHƯ [Đã tạo]
TỪ (CHỌN [Project2]. [ContactId] AS [ContactId], [Project2]. [CompanyId] AS [CompanyId], [Project2]. [ContactName] AS [ContactName], [Project2]. [FullName] AS [FullName] , [Project2]. [ContactStatusId] AS [ContactStatusId], [Project2]. [Tạo] AS [Tạo], row_number () QUÁ (ĐẶT HÀNG B [NG [Project2]. [ContactId] ASC) AS [row_number]
TỪ (CHỌN
[Project1]. [ContactId] NHƯ [ContactId],
[Project1]. [CompanyId] NHƯ [CompanyId],
[Project1]. [Tên liên hệ] NHƯ [Tên liên hệ],
[Project1]. [Tên đầy đủ] NHƯ [Tên đầy đủ],
[Project1]. [ContactStatusId] NHƯ [ContactStatusId],
[Project1]. [Tạo] NHƯ [Đã tạo]
TỪ (CHỌN
[Extent1]. [ContactId] NHƯ [ContactId],
[Extent1]. [CompanyId] NHƯ [CompanyId],
[Extent1]. [Tên liên hệ] NHƯ [Tên liên hệ],
[Extent1]. [FullName] NHƯ [FullName],
[Extent1]. [ContactStatusId] NHƯ [ContactStatusId],
[Extent1]. [Đã tạo] NHƯ [Đã tạo],
(LỰA CHỌN
QUẬN (1) NHƯ [A1]
TỪ [dbo]. [NewsletterLog] NHƯ [Extent2]
WHERE ([Extent1]. [ContactId] = [Extent2]. [ContactId]) VÀ (6 = [Extent2]. [NewsletterLogTypeId])) NHƯ [C1]
TỪ [dbo]. [Liên hệ] NHƯ [Extent1]
) NHƯ [Dự án1]
Ở ĐÂU ([Project1]. [CompanyId] = @ p__linq__0) VÀ ([Project1]. [ContactStatusId] <= 3) VÀ (0 = [Project1]. [C1])
) NHƯ [Dự án2]
) NHƯ [Dự án2]
Ở ĐÂU [Project2]. [Row_number]> 99
ĐẶT HÀNG B [NG [Project2]. [ContactId] ASC ', N' @ p__linq__0 int ', @ p__linq__0 = 4
Có vẻ như Where with EXISTS hoạt động kém hơn nhiều so với tính toán Count và sau đó thực hiện Where with Count == 0.
Hãy cho tôi biết nếu các bạn thấy một số lỗi trong phát hiện của tôi. Điều có thể được loại bỏ khỏi tất cả những điều này bất kể thảo luận Any vs Count là bất kỳ LINQ nào phức tạp hơn sẽ tốt hơn khi được viết lại dưới dạng Thủ tục lưu trữ;).