2

我需要创建一个接收字符串列表的函数,并返回所有匹配项的列表(即 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
4

1 回答 1

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应用所有模式后的调用才会执行。

于 2012-08-01T02:04:28.697 回答