【问题标题】:How to ignore case with LINQ-to-SQL?如何忽略 LINQ-to-SQL 的大小写?
【发布时间】:2011-01-13 03:53:03
【问题描述】:

我在使用 LINQ-to-SQL 获取数据时遇到问题。我使用以下代码为我们的网络应用查找用户(用户名是电子邮件地址):

var referenceUser = 
    db.ReferenceUsers
      .SingleOrDefault(rf => rf.Email == values["emailAddress"]);

如果我输入 test@test.com 我会得到一个 ReferenceUser 但是如果我输入 tESt@tESt.com 我不会。如何让 LINQ 在选择用户时忽略大小写?

【问题讨论】:

  • 早上?我现在是下午 4 点。
  • 如何在数据库中为该列启用不区分大小写?不幸的是,我们仍然生活在需要这种微调的时代。启用索引时,数据库必须知道列是否不区分大小写。

标签: c# linq-to-sql


【解决方案1】:
listTasks.ItemsSource
    = taskList.Where( x => x.TaskDescription.ToLower()
                            .ToString()
                            .StartsWith(txtSearch.Text.Trim()
                            .ToLower()
                            .ToString()));

【讨论】:

    【解决方案2】:

    做:

    var referenceUser = 
        db.ReferenceUsers.SingleOrDefault(
            rf => rf.Email.ToUpper() == values["emailAddress"].ToUpper());
    

    工作?

    ToUpper() 应转换为正确的 SQL 以作为数据库查询运行,然后返回两个结果。

    【讨论】:

    • 如果我不知道有忽略大小写标志,我会这样做,但 +1 表示想法。
    • @David - 你在 LINQ 中的比较方式很重要,因为发送到 SingleOrDefault 的 lambda 表达式已被翻译。这种方式肯定会翻译成SQL。
    • 效果很好。但是对于不在 lambda 中的其他字符串比较,我应该坚持使用 ToLower() 还是应该使用 StringComparison.OrdinalIgnoreCase ??
    • 请注意,在 db 列上调用 .ToLower 将确保即使它被索引,SQL Server 也无法使用该索引。如果表大到足以使表扫描成为一件坏事,则将排序规则更改为不区分大小写的排序规则将是更好的选择。
    • 由于 Unicode 的怪异,ToUpper() 优于 ToLower()(有几个 Unicode 字符没有小写变体),尽管仍然存在歧义(至少)在土耳其语大写 i 是 İ (U+0130: Capital I with dot above), 以匹配他们的小写 I: ı (U+0131, Small Dotless I),但如果没有特定于语言环境,这是不可能解决的比较……
    【解决方案3】:

    我就是这样做的。可能会给你一个提示。我有一个包含个人资料的列表,我想搜索包含“aR”、“Ar”或“AR”的个人资料名称。

    List<Profile> profileList = CreateProfile();
    string search = "aR".ToLower();
    
    profileList = (from p in profileList where p.Name.ToLower().Contains(search)
            orderby p.Name select p).ToList();
    

    【讨论】:

      【解决方案4】:
      var referenceUser = db.ReferenceUsers.SingleOrDefault(rf => string.Compare(rf.Email, values["emailAddress"],true)==0);
      

      “真”是是否忽略大小写

      【讨论】:

      • 只是作为一个考虑点,我认为这不会在服务器上运行。我记得使用这种模式并没有正确解释查询。
      • 显然,通过这个答案的投票方式,SO 读者对 .Net 习语非常满意,但对 IQueryable 上的 LINQ 则不太满意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2017-01-01
      • 2018-05-31
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多