2008-09-15 34 views
5

Có ai tìm ra cách tốt để thực hiện tìm kiếm toàn văn (FREETEXT() CONTAINS()) cho bất kỳ số từ khóa tùy ý nào sử dụng cú pháp truy vấn LINQToSql chuẩn không?LinqToSql và tìm kiếm toàn văn bản - có thể thực hiện được không?

Tôi rõ ràng muốn tránh phải sử dụng một Proc được lưu trữ hoặc phải tạo ra một cuộc gọi SQL động.

Rõ ràng là tôi chỉ có thể bơm chuỗi tìm kiếm ở trên một tham số để một SPROC sử dụng FREETEXT() hoặc CHỨA(), nhưng tôi đã hy vọng để trở nên sáng tạo hơn với việc tìm kiếm và xây dựng các truy vấn như:

"pizza pepperoni" và bánh mì kẹp thịt, không phải "bánh táo".

Điên tôi biết - nhưng sẽ không gọn gàng để có thể thực hiện điều này trực tiếp từ LinqToSql? Bất kỳ lời khuyên về cách để đạt được điều này sẽ được nhiều đánh giá cao.

Cập nhật: Tôi nghĩ rằng tôi có thể vào một cái gì đó here ...

Ngoài ra: Tôi cuộn lại sự thay đổi thực hiện để tiêu đề câu hỏi của tôi, vì nó thực sự đã thay đổi ý nghĩa của những gì tôi đã yêu cầu. Tôi biết tìm kiếm văn bản đầy đủ không được hỗ trợ trong LinqToSql - Tôi đã hỏi câu hỏi đó nếu tôi muốn biết điều đó. Thay vào đó - tôi đã cập nhật tiêu đề của mình để xoa dịu khối lượng chỉnh sửa-vui-kích-ngón.

Trả lời

4

Thật không may LINQ to SQL không hỗ trợ Tìm kiếm toàn văn bản.

Có một loạt sản phẩm ngoài kia mà tôi nghĩ có thể: Lucene.NET, NHibernate Search xuất hiện trong đầu bạn. LINQ cho NHibernate kết hợp với NHibernate Search có lẽ sẽ cung cấp cho chức năng đó, nhưng cả hai vẫn còn cách sâu trong phiên bản beta.

+0

Xin chào Jon, cảm ơn vì điều này. Tôi hài lòng với câu trả lời của bạn về nguyên tắc và nhận thức được rằng tôi có thể thêm một lớp trừu tượng khác. Không lý tưởng tho - cũng có thể viết CONTAINS() SPROC & sử dụng LINQ cho mọi thứ khác. Câu hỏi của tôi là "Nó có thể được thực hiện bằng cách sử dụng LINQ"? Nếu không, thì câu trả lời của bạn sẽ đủ. – RobertTheGrey

+0

Tôi đã quyết định sử dụng Lucene.NET cho điều này ngay bây giờ và nó thực sự hoạt động khá tốt. Bây giờ tôi chỉ cần để có được Memcached chạy và tôi hầu như không cần phải nhấn DB ;-) – RobertTheGrey

5

Tôi đã quản lý để làm được việc này bằng cách sử dụng một chức năng bảng có giá trị để đóng gói các thành phần tìm kiếm văn bản đầy đủ, sau đó tham chiếu nó trong biểu thức LINQ tôi duy trì những lợi ích của thực hiện chậm:

string q = query.Query; 
IQueryable<Story> stories = ActiveStories 
         .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o) 
         .Where (s => (query.CategoryIds.Contains(s.CategoryId)) && 
            /* time frame filter */ 
           (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) && 
           (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value))); 

Dưới đây tvf_SearchStories 'là hàm có giá trị trong bảng mà nội bộ sử dụng tìm kiếm toàn văn bản

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