【问题标题】:Compare strings ignoring case比较字符串忽略大小写
【发布时间】:2016-01-29 06:49:20
【问题描述】:

我正在尝试通过其Name 属性在数据库中查找实体(Tags),忽略大小写很重要(当搜索database 并且数据库包含名称为@ 的标签时987654325@,应该退回)。现在,我的代码如下所示:

public IEnumerable<db.Tag> FindByNames(IEnumerable<string> tagNames)
{
    return this.DatabaseContext.Tags
        .Where(tag => tagNames.Contains(tag.Name));
}

显然,这个是区分大小写的。我试图提供StringComparer.OrdinalIgnoreCase 作为Contains 方法的比较器,但在执行期间收到警告,表示无法翻译表达式并将在代码中而不是在数据库中执行(我不记得确切的消息,我一回到我的开发机器上就会编辑)。如果必须,我可以忍受,但在这种情况下知道如何让数据库完成工作会很好。有可能吗?

【问题讨论】:

  • 请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!此外,您可能需要重新考虑Contains-操作,因为这将具有线性(或更差)性能 - 如果集合包含许多元素,则插入带有索引的临时表并进行连接可能是一个选项。

标签: sqlite entity-framework-core


【解决方案1】:

不需要进行任何更改。 SQLite 的“LIKE”已经不区分大小写了。

LIKE 运算符的默认行为是忽略 ASCII 字符的大小写。

(cref https://www.sqlite.org/pragma.html#pragma_case_sensitive_likeCase sensitive and insensitive like in SQLite

当然,您始终可以使用.FromSql() 来获取您想要的确切查询。示例:

context.Tags.FromSql("SELECT * FROM tags WHERE name LIKE '%{0}%'", tagName)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多