【问题标题】:Searching for multiple strings using single database query with entity framework and LINQ使用带有实体框架和 LINQ 的单个数据库查询来搜索多个字符串
【发布时间】:2018-08-20 09:37:58
【问题描述】:

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

id : 整数

名称:字符串

要求: 我想检索 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 个数据库查询的情况下搜索多个字符串(如第二种方法)?

【问题讨论】:

  • 我通常使用 Context.Set().AsEnumerable().Select(x => x.Field("name")).Distinct().ToList(); .
  • 这会从表中选择列名中的所有条目。但我想选择匹配(LIKE sql 语句)字符串列表(不是单个字符串)的条目
  • 然后使用 Context.Set().AsEnumerable().Select(x => x.Field("name")).Distinct().Where(x => stringsToSearchFor.Contains(x)).ToList();

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


【解决方案1】:

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

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

Here's the documentation for DbFunctions.Like.

【讨论】:

  • 很棒的解决方案!我唯一需要更改的是 $"%{s}%" 到字符串连接,因为这会转换为字符串。 EF 无法理解的格式。谢谢!
  • @ashilon 没想到!我更新了字符串连接的答案以避免混淆。
【解决方案2】:

这样的事情应该可以工作:

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多