【问题标题】:Do a Range Search for a Alphabetic Field对字母字段进行范围搜索
【发布时间】:2010-12-18 13:54:58
【问题描述】:

我有一个将其保存在数据库中的应用程序:

FromLetter ToLetter
AAA         AAZ
ABC         MNL

我需要像这样搜索 AAC 并返回记录 1 和 FBC 并返回记录 2。 如果我保存日期而不是字母,则功能相同。我需要做同样的查询。

我正在使用 SQL Server 和实体框架,有什么想法吗?

【问题讨论】:

  • 您想要 SQL Server 答案还是 EF 答案?
  • SELECT * FROM a_table WHERE substr(FromLetter,1,1) =substr("AAC",1,1) OR substr(FromLetter,2,1) = substr("FBC ", 2,1) 限制 2;查找substr 的定义,SQL server 的子字符串函数。这只是一个例子substr(input, start, length)。对于日期,可能是 day(fromLetter) 而不是 substr
  • @Frayer: substr 不是 SQL Server,也不是 limit。
  • ... 在 FromLetter 和 ToLetter 之间进行 stringtosearch ...

标签: c# sql-server entity-framework


【解决方案1】:

应该很直截了当。这是一个 Linq to Entities 解决方案,忽略大小写:

实体框架/Linq 解决方案字符串:

string yourValue = somevalue;
var result = (from r in db.ExampleTable
              where String.Compare(yourValue, r.FromLetter, true) == 1
              && String.Compare(yourValue, r.ToLetter, true) == -1
              select r).First();

日期:

DateTime yourValue = somevalue;
var result = (from r in db.ExampleTable
              where yourValue >= r.FromDate
              && yourValue <= r.ToDate
              select r).First();

【讨论】:

  • 您不能在实体框架中使用 >= 和
  • 抱歉,我忽略了 .NET 本身并不比较字符串。这应该适用于日期,我编辑以显示字符串的正确方式,使用 String.Compare。刚刚使用 VS 2010 和 .NET 4 进行了测试
【解决方案2】:

我认为使用整数表示FromLetterToLetter 属性会容易得多。特别是如果字符串的长度始终只有 3 - 您可以简单地将数字编码为:

(((letter1 - 'A') * 26 + (letter2 - 'A')) * 26) + (letter3 - 'A')

这将为您提供一个介于 0 和 26^3 之间的数字,它代表三元组,并且可以轻松转换回字符串(在数字基数之间转换数字时使用模和除法)。这个数字很适合 Int32(最多 6 个字母)。

在指定范围内搜索字符串将是在数字范围内简单搜索整数(这很容易做到高效)。

【讨论】:

    【解决方案3】:

    由.... bunglestink 给出的天才解决方案

    我浪费了大量时间研究 EF 中字符串的“between”子句的实现。这很有帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多