2011-10-16 346 views
2

我有一種情況,我有表中的關鍵字列包含逗號分隔的關鍵字。用戶可以提供多個搜索條件以在關鍵字列中進行搜索。例如,用戶提供了下面的搜索條件「一,二,三」,並且db列可以包含「one」,「two」,「three」或其中任何一個。我該如何編寫一個與任何提供的搜索詞相匹配的查詢。Linq多關鍵字搜索

我曾嘗試以下

string[] searchTerm = {"one","two","three"}; 

query =Product.Where(p=> searchTerm.Any(val => p.Keywords.Contains(val))); 

var query=db.Products; 

foreach (string searchword in searchTerm) 
    { 
    query = query.Where(c => c.Keywords.Contains(searchword)); 
    } 

,但它不是爲我工作。
謝謝,

+2

嗯,你的數據庫是不正確d esigned。不應該有任何格式的包含列表的列。您應該創建一個新表,其中包含關鍵字並且具有原始表的外鍵。 – svick

回答

1

如果你在一個字符串分割在不同的關鍵字,用戶提供的文本,如將「一,二」,三」 [],你可以這樣做:

string [] keys = keywords.Split(','); 
var query = new List<Product>(); 
foreach (var item in keys) 
{ 
    query = query.Concat ((IEnumerable<Product>)Product.Where(x=>x.KeyWords.Contains(item))).ToList(); 
} 

例子:

List<Product> ass = new List<Product>(); 

Product a = new Product(); 
a.KeyWords = "one, two, three"; 

Product a1 = new Product(); 
a1.KeyWords = "one, three"; 

Product a2 = new Product(); 
a2.KeyWords = "five"; 

ass.Add(a); 
ass.Add(a1); 
ass.Add(a2); 

string userInput = "one, seven"; 

string [] keys = userInput.Split(','); 
var query = new List<Product>(); 
foreach (var item in keys) 
{ 
    query = query.Concat ((IEnumerable<Product>)ass.Where(x=>x.KeyWords.Contains(item))).ToList(); 
} 

foreach (var item in query) 
{ 
    Console.WriteLine(item.KeyWords); 
} 

打印:

one, two, three 
one, three 
+0

謝謝lcarus ...這對我有幫助但對我來說ANDing查詢應該是ORing ...所以如果用戶輸入一個,兩個,三個但是如果用戶輸入一個,九個,十一個就會失敗 – Tepu

+0

@ user784552這個例子我提供的是一個OR,而不是一個AND。你需要分割** USER **輸入的關鍵字(你說它是用逗號分隔的),然後在foreach循環中通過所有這些關聯匹配的關鍵字。例如,如果您的表格列具有「一,二,二三」,並且用戶輸入「一,五」,則它將匹配,因爲表格中的列和用戶輸入中的列都包含「一」。 – Icarus