2012-07-19 33 views
7

Tôi đã cố gắng để giải quyết vấn đề này cả ngày, và đã không tìm thấy một giải pháp thực sự hoạt động. Khi tôi tìm kiếm một số dữ liệu, tôi muốn lọc dữ liệu dựa trên nhiều từ.LINQ truy vấn để phù hợp với nhiều từ

Giá trị đầu vào của tôi được chia nhỏ bằng cách sử dụng hàm .Split chuẩn.

string[] searchstrings = MessageResult.Split(' '); 

Tôi đã thực hiện truy vấn (rõ ràng là không hoạt động chính xác) để lọc ra tất cả các mục khớp với mọi chuỗi trong đường tìm kiếm.

    var suggestions = (from a in query 
           from w in searchstrings 
           where a.Message.ToLower().Contains(w.ToLower()) 
           select a).Distinct(); 

truy vấn là biến của tôi có tất cả dữ liệu. Làm thế nào tôi có thể làm cho truy vấn này để thực sự chỉ phù hợp với mục nhập bao gồm tất cả các chuỗi trong searchstrings?

+0

Để làm rõ, bạn muốn các chuỗi từ truy vấn có chứa mọi chuỗi phân tách, có nghĩa là, ** mỗi chuỗi ** trong chuỗi tìm kiếm phải nằm trong chuỗi kết quả? – Breland

+0

nếu câu hỏi của @Breland là đúng, điều đó sẽ làm việc thay đổi .Tiếp tục .All Tôi muốn xem truy vấn được tạo ra bởi biểu thức đó – jjchiw

+0

kết quả cuối cùng của bạn là gì? – Yasser

Trả lời

17

Tôi nghĩ rằng mã bên dưới sẽ giải quyết được vấn đề của bạn. Nó sẽ kiểm tra xem tất cả các từ trong chuỗi tìm kiếm có trong truy vấn hay không (a).

var suggestions = (from a in query 
        where searchstrings.All(word => a.ToLower().Contains(word.ToLower())) 
        select a); 
+0

Điều này làm việc tuyệt vời, cảm ơn! – Alexander

16
var query = new string[] 
{ 
    "abc foo bar xyz john doe", 
    "abc foo bar xyz doe", 
    "hello world", 
    "abc foo bar john doe", 
}; 

var searchstrings = new string[] 
{ 
    "abc", 
    "foo", 
    "john", 
    "xyz", 
}; 

searchstrings = searchstrings.Select(x => x.ToLower()).ToArray(); 

var results = query.Select(x => x.ToLower()) 
        .Where(x => searchstrings.All(y => x.Contains(y))); 

Lưu ý:
ToLower() được thực hiện bên ngoài các khoản Where, để tiết kiệm rất nhiều cuộc gọi đến phương thức đó.

+3

+1 để tái cấu trúc lệnh gọi '.ToLower' ... –

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