我需要创建一个接收字符串列表的函数,并返回所有匹配项的列表(即SQL“LIKE”,不区分大小写并忽略变音符号):
// Pseudocode example
IEnumerable<Item> Search(List<String> patterns)
{
var result = new List<Item>();
foreach (var Item in context.Items)
{
bool matches = true;
foreach (var pattern in patterns)
{
if (!Item.Name.Contains(pattern))
{
matches = false;
break;
}
}
if (matches)
{
result.Add(Item);
}
}
return result;
}
虽然类似的东西起作用,但它不太理想(看起来非常低效)。
是否可以创建一个(可能是LINQ)查询来生成类似于以下SQL的内容?:
SELECT *
FROM items
WHERE items.name LIKE :pattern1
AND items.name LIKE :pattern2
...
AND items.name LIKE :patternN
答案 0 :(得分:3)
您可以简单地迭代模式并为每个模式应用WHERE
子句。
var patterns = new List<string>();
using (var context = new MyDataContext())
{
var query = (IQueryable<Area>)context.Areas;
foreach (var pattern in patterns)
{
query = query.Where(a => a.Description.Contains(pattern));
}
return query.ToList();
}
正如您可能知道的那样,查询是惰性执行的,在这种情况下,在应用所有模式后ToList
调用之前不会执行。