2011-10-16 254 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