2013-06-05 23 views
7

Tôi có một dòng LINQ mà im sử dụng trong EF mà về cơ bản làm myTable.Where(c => c.Contains('mystring'));Hãy Entity Framework sử dụng Có thay vì Giống như và giải thích 'ESCAPE ~'

Đây là các mã được tạo:

SELECT TOP (300) 
[Extent1].[ID] AS [ID], 
[Extent1].[FKFishEntityID] AS [FKFishEntityID], 
[Extent1].[Fish] AS [Fish], 
[Extent1].[FishText] AS [FishText], 
[Extent1].[FishType] AS [FishType] 
FROM [dbo].[Fish] AS [Extent1] 
WHERE [Extent1].[FishText] LIKE @p__linq__0 ESCAPE '~' 

Hai câu hỏi của tôi là:

  • Làm cách nào để sử dụng CONTAINS (...) thay vì LIKE? Dường như LIKE rất chậm khi bảng đang sử dụng chỉ mục toàn văn. Sao chép và dán truy vấn phải mất 4 giây để thực thi, nhưng nếu tôi thay đổi LIKE thành CONTAINS() nó sẽ thực hiện ngay lập tức.

  • Tại sao nó thực hiện ESCAPE '~'? Bằng cách sao chép + dán vào máy chủ SQL, nó thực hiện nhanh hơn khoảng 4 lần nếu tôi loại bỏ phần 'ESCAPE'.

+0

Thoát có lẽ là do tránh ký tự đại diện. Hãy thử đặt 'mystring *' thay vì 'mystring' - trong SQL Server, nó sẽ được chuyển thành' mystring ~ * 'có thể - do đó thoát ra nói rằng ký tự dấu ngã trước ký tự đại diện có nghĩa là nó không phải là ký tự đại diện mà chính xác là ký tự này. – Pako

+0

hmm, thêm * không tạo sự khác biệt. Tôi nghĩ rằng nó được kết nối với LIKE vì vậy nếu tôi có thể giải quyết điểm 1 nó có thể giải quyết điểm 2 – NibblyPig

+0

đã không làm cho một sự khác biệt trong ý nghĩa gì? Bạn đã nhìn trộm giá trị tham số trong máy chủ sql (sử dụng ví dụ profiler)? Tôi biết nó không giải quyết vấn đề của bạn hoặc giúp đỡ - nó chỉ là mẹo về lý do tại sao thoát là có. – Pako

Trả lời

4

từ [blog của khuôn khổ thực thể]: 1

Không có hỗ trợ cho tìm kiếm toàn văn dự kiến ​​vào lúc này. Bạn sẽ cần sử dụng truy vấn SQL thô.

Có vẻ như là con đường để đi là một cái gì đó như thế này:

using (var context = new BloggingContext()) 
{ 
    var fishes = context.Fishes.SqlQuery("SELECT * FROM dbo.Fishes WHERE CONTAINS(FishText, @p0)", searchPhrase).ToList(); 
} 
+0

Cuối cùng, tôi đã tạo một thủ tục lưu sẵn để thực hiện truy vấn CONTAINS đơn giản. – NibblyPig

Các vấn đề liên quan