使用带有实体框架和LINQ的单个数据库查询来搜索多个字符串

时间:2018-08-20 09:37:59

标签: c# entity-framework linq linq-to-sql entity-framework-6

假设我有一个包含两列的数据库表(aTable)

id:int

名称:字符串

要求: 我想检索aTable.name类似于字符串列表(stringsToSearchFor)的条目。

我在做什么: 目前,我正在使用以下方法

var result=new List<aTable>; 
foreach (var aString in stringsToSearchFor)
    {
        var r = Context.Set<aTable>()
                .Any(s => s.name.Contains(searchString))
                .ToList();
        res.AddRange(r);
    }
return result.Distinct();

为了对其进行优化,我尝试通过消除foreach来更改代码,使其成为:

return Context.Set<aTable>()
                    .Any(s => stringsToSearchFor.Contains(s.name))
                    .Distinct()
                    .ToList();

但是,这没有提供与前面的语句相同的结果。我相信第一句话是正确的。

我的问题:如何在不创建N个数据库查询的情况下搜索多个字符串(如第二种方法)?

2 个答案:

答案 0 :(得分:0)

类似的事情应该起作用:

string[] stringsToSearchFor = new string[] { "text1", "text2" };

using (MyDbContext model = new MyDbContext())
{
    var result = model.aTable
        .Where(r => stringsToSearchFor.Any(s => r.name.Contains(s)))
        .ToList();
}

答案 1 :(得分:0)

替代解决方案:使用EF 6.2 Like

.Where(x => stringsToSearchFor.Any(s => DbFunctions.Like(x.name, $"%{s}%")))

Here's the documentation for DbFunctions.Like.