2010-01-06 30 views
5

Tôi có một trường hợp trong ứng dụng của mình nơi người dùng có thể tìm kiếm danh sách các cụm từ. Tìm kiếm cần phải thực hiện ba lần theo thứ tự sau:LINQ to SQL bất kỳ truy vấn tìm kiếm từ khóa

  • Một đối sánh chính xác với những gì họ đã nhập. Xong, dễ dàng.
  • Một nơi tất cả các từ (riêng lẻ) khớp nhau. Xong, cũng dễ.
  • Một trong đó bất kỳ số nào của từ khớp ... làm thế nào?

Về cơ bản, làm cách nào, trong LINQ to SQL, nói với nó để làm điều này:

select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Title like... 

Và như vậy?

+0

Bạn nên biết rằng loại điều này thực sự được xử lý tốt nhất bằng Tìm kiếm toàn văn bản. Phiên bản 'LIKE '% xyz%'' sẽ chạy, nhưng hiệu suất sẽ hút. – Aaronaught

Trả lời

7

Đây có thể là một điều khó khăn ... Tôi nghĩ bạn phải viết toán tử của riêng bạn.

(Cập nhật:. Yep, tôi đã thử nghiệm nó, nó hoạt động)

public static class QueryExtensions 
{ 
    public static IQueryable<TEntity> LikeAny<TEntity>(
     this IQueryable<TEntity> query, 
     Expression<Func<TEntity, string>> selector, 
     IEnumerable<string> values) 
    { 
     if (selector == null) 
     { 
      throw new ArgumentNullException("selector"); 
     } 
     if (values == null) 
     { 
      throw new ArgumentNullException("values"); 
     } 
     if (!values.Any()) 
     { 
      return query; 
     } 
     var p = selector.Parameters.Single(); 
     var conditions = values.Select(v => 
      (Expression)Expression.Call(typeof(SqlMethods), "Like", null, 
       selector.Body, Expression.Constant("%" + v + "%"))); 
     var body = conditions.Aggregate((acc, c) => Expression.Or(acc, c)); 
     return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
    } 
} 

Sau đó, bạn có thể gọi này với:

string[] terms = new string[] { "blah", "woo", "fghwgads" }; 
var results = stuff.LikeAny(s => s.Title, terms); 

T.B. Bạn sẽ cần phải thêm các không gian tên System.Linq.ExpressionsSystem.Data.Linq.SqlClient vào không gian tên của bạn cho lớp QueryExtensions.

+0

Đã hoạt động! Cảm ơn bạn! – Dusda

+0

Tôi đã sử dụng mã trong LINQ to Entities và tôi gặp phải lỗi này: LINQ to Entities không nhận ra phương thức 'Boolean Like (System.String, System.String)' và phương thức này không thể được dịch sang biểu thức cửa hàng. –

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