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
Where cust.Name = "Vogel"
Select cust
Sẽ trở thành
Select *
From Customers
Where Name = N'Vogel'
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
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