【问题标题】:How can I do a 'StartsWith' search on each string of a single attribute using entity framework dbcontext如何使用实体框架 dbcontext 对单个属性的每个字符串进行“StartsWith”搜索
【发布时间】:2016-10-17 04:37:54
【问题描述】:

嘿,我正在尝试使用 c# 实体框架查询我的数据库,但我对某些逻辑感到困惑。

例如,假设我们正在数据库中搜索一个地名,我们正在搜索的名称是“雪兰多国家公园”

如果我输入“国家”或“公园”——我希望“雪兰多国家公园”出现在我的搜索结果中。

下面的代码只会匹配地名的第一个字符串。

如果我输入“国家”,我不会得到任何结果。有人可以帮我解释一下逻辑吗,我对实体框架语法并不熟悉。谢谢!

   Entities dbPOEntity = new Entities(); //Entities is an auto generated class that extends dbContext 

   List<Space> lsSpace = dbPOEntity.Spaces.Where(sp => sp.Name.StartsWith(word)).OrderBy(sp => sp.Name).ToList();

编辑:例如只想要 --- she nat par (any or all) 的结果

【问题讨论】:

  • 使用.Contains 而不是.StartsWith
  • 我认为您需要将其映射为 SQL 函数
  • 你输入了什么"andoah"?你想让它匹配"shenandoah national park"吗?
  • @DStanley 不,我们只会得到她 nat par (any or all) 的结果
  • 我知道这并不能直接解决问题,但是在这样的数据库中实现全文搜索并不是很有效。像 ElasticSearch (Lucene) 这样的专用搜索引擎更适合于此。我提到这一点是因为我自己吸取了教训,并希望有人给我这个建议。另一种选择是将文本字符串解析为标记并将各个标记存储在单独的表中。也许我对你的问题读得太多了,我的建议并不适用。如果是这样,请继续,忘记你曾经读过这篇文章。

标签: c# entity-framework search dbcontext


【解决方案1】:

为您的提交编辑。试试看。

Entities dbPOEntity = new Entities(); //Entities is an auto generated class that extends dbContext 

List<Space> lsSpace = dbPOEntity.Spaces
.Where(sp =>   sp.Name.Contains(word+" ")
             ||sp.Name.Contains(" "+word)).OrderBy(sp => sp.Name).ToList();

【讨论】:

  • 如果我们搜索像“con”这样的字符串会出现这个问题——我们会得到像“Wisconsin”这样的结果,我们希望避免这种情况用于商业用途。不过还是谢谢
  • 你能给我一个需要 sp.Name.Contains(word+" ") 的搜索词的例子吗?我不确定我是否需要那个
【解决方案2】:

只需添加单词前面有空格的情况:

List<Space> lsSpace = dbPOEntity.Spaces
                                .Where(sp => sp.Name.StartsWith(word) 
                                          || sp.Name.Contains(" "+word)
                                .OrderBy(sp => sp.Name)
                                .ToList();

请注意,该查询将需要全表扫描,因为您无法创建一个查找任意子字符串 的索引。如果字符串字符串开头,但不能包含,则可以使用in index。

【讨论】:

    【解决方案3】:

    你不希望它这个词开头,你希望它包含这个词。

    List<Space> lsSpace = dbPOEntity.Spaces
        .Where(sp => sp.Name.Contains(word))
        .OrderBy(sp => sp.Name)
        .ToList();
    

    【讨论】:

    • 如果我们搜索像“con”这样的字符串会出现这个问题——我们会得到像“Wisconsin”这样的结果,我们希望避免这种情况用于商业用途。不过还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2018-11-21
    • 2015-07-25
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多