实体框架中的复杂动态查询

时间:2012-08-01 01:55:53

标签: c# entity-framework

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

1 个答案:

答案 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调用之前不会执行。