在LINQ2SQL中选择值落在两个字符串之间的记录

时间:2017-02-27 14:01:29

标签: c# linq sql-server-2008

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

例如在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

然后它会给我数据库中与这些最小值和最大值相对应的所有行,但如果我尝试使用一个应该落在这两个值中的值,则不会出现任何内容。

1 个答案:

答案 0 :(得分: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

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