2014-04-09 12 views
7

Tôi cần hiểu điều này. Có sự khác biệt lớn giữa EF5.0 và EF6 * trong TSQL mã thế hệEntityFramework LINQToEntities tạo TSQL chậm kỳ lạ ở đâu-khoản

Trong mã tôi đây là LINQ của tôi -. Statemant

var qry2 = context.viw_overview_1.Where(i => i.article_EAN17 == ean).Select(i => i.article_id).Take(200); 

EntityFramework 5,0 tạo ra chỉ là một TSQL đơn giản và nhanh chóng Ở ĐÂU - tuyên bố như thế này, đó là hoàn hảo

... WHERE [Extent1].[article_EAN17] = @p__linq__0 
00.0960096ms in SSMS 

nhưng EntityFramework 6. * tạo ra một tuyên bố phức tạp và chậm hơn nhiều

... WHERE (([Extent1].[article_EAN17] = @p__linq__0) AND (NOT ([Extent1].[article_EAN17] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[article_EAN17] IS NULL) AND (@p__linq__0 IS NULL)) 
45.3665362ms in SSMS 

trường article_EAN17 cũng có chỉ mục. tuy nhiên EF6. * Mất độ tuổi để khởi tạo, NHƯNG có cách nào để tạo ra một câu lệnh WHERE đơn giản trong EF6. * Với các thuộc tính hoặc một cái gì đó như thế này? Tôi đã thử sử dụng chuỗi.Equals(), string.Compare(), xoay thông số, nhưng không có gì thay đổi.

Why does Entity Framework 6 generate complex SQL queries for simple lookups? giải thích sự khác biệt, Nhưng có cách nào để buộc EF tạo TSQL đơn giản hay không.

+1

Tôi nghi ngờ thay đổi T-SQL đang làm chậm mọi thứ. Bạn đã thử cả hai truy vấn trên cùng một tập dữ liệu? – haim770

+1

Chỉ tò mò - bạn đã tát hai câu lệnh vào SSMS và so sánh hiệu suất của chúng? –

+0

so sánh đơn giản EF5 nhanh hơn 5 lần so với EF6 trong C# và nhanh hơn nhiều trong SSMS – Roland

Trả lời

8

Tôi tin rằng điều này có liên quan đến thiết lập so NULL của bạn trong Entity Framework

thêm mã sau đây trước khi truy vấn của bạn để xem nếu nó giúp hiệu suất truy vấn của bạn:

context.ContextOptions.UseCSharpNullComparisonBehavior = true; 
+1

Không phải là sai theo mặc định? http://msdn.microsoft.com/en-us/library/system.data.entity.core.objects.objectcontextoptions.usecsharpnullcomparisonbehavior(v=vs.113).aspx – IronMan84

+3

thực tế nó là 'context.Configuration.UseDatabaseNullSemantics = true; 'thx thành MattC – Roland

+0

Chỉ cần cập nhật câu trả lời. xin lỗi vì lỗi đánh máy. – mmilleruva

1

Nếu bạn hoàn toàn, tích cực cần để có thêm null kiểm tra cắt nhỏ, bạn luôn có thể sử dụng DbSet.SqlQuery() (tài liệu here) để cấu hình truy vấn theo cách thủ công (và tất cả các tham số) mà bạn muốn nó chạy. Tuy nhiên, hãy cẩn thận, bởi vì đôi khi phương pháp đó có thể hoạt động theo những cách mà bạn không mong đợi. Nếu bạn không muốn/cần theo dõi bất kỳ, bạn cũng có thể sử dụng (tài liệu here), điều này sẽ cho phép bạn sử dụng Generics với truy vấn của bạn (nếu không bạn sẽ phải bỏ nó).

Cá nhân tôi rất muốn rời bỏ nó một mình hoặc sử dụng Thủ tục được lưu trữ, như @EricScherrer được đề cập trong các nhận xét.