Saturday, May 25, 2019

Tuyệt chiêu tránh khỏi sự chậm chạm của Entity Framework




Nhìn chung mà nói, tôi chả lo lắng gì nhiều về câu lệnh LINQ của tôi khi làm việc với Entity Framework. Tôi luôn luôn nói với khách hàng của mình rằng nếu họ muốn tăng tốc độ truy cập dữ liệu họ nên xem lại cách thiết kế cơ sở dữ liệu, đặc biệt là cách sử dụng index.

Nhưng vẫn có một ngoại lệ cho quy tắc này: nếu bạn có một câu lệnh so sánh một cột char hoặc một cột varchar, bạn đã có thể làm chậm đi câu lệnh LINQ của mình. Vấn đề là Entity Framework coi rằng dữ liệu chuỗi của bạn là kiểu unicode (nchar hoặc nvarchar) nên nếu mà bạn vướng phải tường hợp này thì một vài sự chuyển đổi kiểu dữ liệu sẽ khiến cho câu lệnh của bạn chạy chậm chạm đi

Câu lệnh LINQ
Var res = From cust In db.Customers
            Where cust.Name = "Vogel"
           Select cust

Sẽ trở thành
Select *
From Customers
Where Name = N'Vogel'

Bởi vì Entity Framework mặc định rằng cột dữ liệu của bạn là kiểu Unicode, nó nối thêm N đằng trước chuỗi truy vấn của bạn rồi cố gắng so sánh một chuỗi Unicode (biến bạn truyền vào) với một chuỗi non-Unicode (cột dữ liệu của bạn)

Giải pháp là chỉ cho Entity Framework biết là cột của bạn là cột char hoặc varchar bằng cách thiết lập thuộc thính Column với TypeName là varchar

<Column(TypeName="varchar")>
Public Property Name As String


Một bài viết dài hơn mô tả cụ thể trường hợp dính phải vụ này được đăng ở blog post của Brian Sullivan và cách anh ấy xử lý vấn đề.


No comments:

Post a Comment

Tuyệt chiêu tránh khỏi sự chậm chạm của Entity Framework

Nhìn chung mà nói, tôi chả lo lắng gì nhiều về câu lệnh LINQ của tôi khi làm việc với Entity Fra...