【问题标题】:Selecting a record where value falls between two strings in LINQ2SQL在 LINQ2SQL 中选择值介于两个字符串之间的记录
【发布时间】:2017-02-27 14:01:29
【问题描述】:

如果特定值介于两列的值之间,如何从表中选择一行或多行?

例如在 SQL 中:

SELECT * FROM MyTable WHERE '123ABC' BETWEEN MinValue AND MaxValue

我在 LINQ 中尝试了以下方法(使用 LINQpad):

from d in MyTable
          where d.MinValue.CompareTo("ABBBBC") >= 0 &&
                d.MaxValue.CompareTo("ABBBBC") <= 0
 select d

但它只给了我 0 个结果。如果我知道 MinValue 和 MaxValue 中的两个值并插入它们,例如:

from d in MyTable
          where d.MinValue.CompareTo("AAAAAA") >= 0 &&
                d.MaxValue.CompareTo("CCCCCC") <= 0
 select d

然后它将为我提供数据库中与这些最小值和最大值相对应的所有行,但如果我尝试使用应该属于这两个值的值,则不会出现任何结果。

【问题讨论】:

  • 您必须交换 &lt;&gt; 符号。
  • 不,那也没有用。如果我从 LINQPad 获取生成的 SQL 语句,很明显我希望我给出确切的最小值和最大值,而不是找到我的值 (x) 介于 MinValue 列和 MaxValue 列之间的行。

标签: c# linq sql-server-2008


【解决方案1】:

Gert Arnold 是正确的,您混淆了比较运算符。

对于您的原始 LINQ 表达式

from d in MyTable
          where d.MinValue.CompareTo("ABBBBC") >= 0 &&
                d.MaxValue.CompareTo("ABBBBC") <= 0
 select d

生成以下 SQL 查询:

-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'ABBBBC'
DECLARE @p1 NVarChar(1000) = 'ABBBBC'
-- EndRegion
SELECT [t0].[MinValue], [t0].[MaxValue]
FROM [MyTable] AS [t0]
WHERE ([t0].[MinValue] >= @p0) AND ([t0].[MaxValue] <= @p1)

whis 等价于

SELECT * FROM MyTable WHERE 'ABBBBC' BETWEEN MaxValue AND MinValue

这显然是不正确的。将查询更改为

from d in MyTable
          where d.MinValue.CompareTo("ABBBBC") <= 0 &&
                d.MaxValue.CompareTo("ABBBBC") >= 0
 select d

应该产生所需的结果。如果您仍然认为它不正确,请提供您认为应该由查询返回的数据行和您的过滤值。

【讨论】:

  • 我不知道我昨天做了什么,我一定是喝醉了或者刚刚离开,它就像一个魅力。谢谢。 :)
猜你喜欢
  • 2015-08-10
  • 1970-01-01
  • 2017-12-27
  • 2022-01-25
  • 2012-08-23
  • 2021-10-30
  • 1970-01-01
  • 2013-12-31
  • 2012-02-02
相关资源
最近更新 更多