Không có tìm kiếm văn bản đầy đủ xây dựng vào LINQ và có dường như không có nhiều bài viết về đề tài này vì vậy tôi đã một vở kịch xung quanh và đã đưa ra phương pháp này cho các lớp học utlity tôi:Full Text Search trong LINQ
public static IEnumerable<TSource> GenericFullTextSearch<TSource>(string text, MyDataContext context)
{
//Find LINQ Table attribute
object[] info = typeof(TSource).GetCustomAttributes(typeof(System.Data.Linq.Mapping.TableAttribute), true);
//Get table name
String table = (info[0] as System.Data.Linq.Mapping.TableAttribute).Name;
//Full text search on that table
return context.ExecuteQuery<TSource>(String.Concat("SELECT * FROM ", table, " WHERE CONTAINS(*, {0})"), text);
}
Và thêm wrapper này đến từng lớp LINQ một phần, nơi có một chỉ mục văn bản đầy đủ
public static IEnumerable<Pet> FullTextSearch(string text, MyDataContext context)
{
return (LinqUtilities.GenericFullTextSearch<Pet>(text, context) as IEnumerable<Pet>);
}
Vì vậy, bây giờ tôi có thể thực hiện tìm kiếm văn bản đầy đủ với công cụ hữu ích như
var Pets = Pet.FullTextSearch(helloimatextbox.Text, MyDataContext).Skip(10).Take(10);
Tôi giả định chỉ có một tìm kiếm rất cơ bản là cần thiết hiện nay. Có ai có thể cải thiện điều này không? Có thể thực hiện như một phương pháp mở rộng và tránh các wrapper?
Một nguy hiểm/vấn đề unoptimal về truy vấn của bạn là .Skip(). Take() sẽ được thực hiện clientside, chứ không phải serverside. Vì vậy, nếu bạn thực hiện một FTS trả về 10^6 kết quả và bạn muốn chỉ có 10 kết quả đầu tiên, tất cả 10^6 trong số chúng sẽ được trả lại từ cơ sở dữ liệu và chỉ khi đó bạn mới thực hiện việc lọc. –
Aye, trên tập dữ liệu lớn tôi sẽ xem xét kỹ thuật khác;) – ctrlalt3nd
Có thể trùng lặp của [Có thể sử dụng Tìm kiếm Toàn văn (FTS) với LINQ không?] (Http://stackoverflow.com/questions/224475/is -it-possible-to-use-full-text-search-fts-với-linq) –