0

如何构建一个 SQL Server 兼容的表达式树,它可以比较一个字符串,就好像它是一个整数一样?

我的表包含电话号码(例如“01234000000”),我希望动态创建的查询返回一系列电话号码。

我想要的 SQL 是这样的:

SELECT PhoneNumber 
FROM MyTable 
WHERE PhoneNumber BETWEEN '01234000000' AND '01234000099'

即使 PhoneNumber 是一个 VARCHAR ,它也是完全有效的 SQL 并返回您期望的结果。

我已经尝试了几件事(为清楚起见省略了上限):

Expression.GreaterThanOrEqual(prop, "01234000000") // doesn't work on strings

Expression.GreaterThanOrEqual(
    Expression.Convert(prop, typeof(Int64)), 
    Expression.Constant(1234000000, typeof(Int64))) // not supported by the SQL Query Provider

有没有其他方法可以实现这一目标?如果没有,那么是否可以扩展查询提供程序以将其添加到我自己中,我该怎么做?

4

1 回答 1

2

据我所知,SQL 并不是真正进行数字比较,而是进行 alpha 比较。但是,由于您使用的是长度相同的电话号码,因此这种差异应该无关紧要。

您可以在 EF 中执行以下操作:

var lowerBound = "01234000000";
var upperBound = "01234000099";
var results = MyTable
    .Where(t => t.PhoneNumber.CompareTo(lowerBound) >= 0 && t.PhoneNumber.CompareTo(upperBound) <= 0);

根据 LinqPad,生成以下 SQL:

DECLARE @p0 VarChar(1000) = '01234000000'
DECLARE @p1 VarChar(1000) = '01234000099'

SELECT [t0].[PhoneNumber]
FROM [MyTable] AS [t0]
WHERE ([t0].[PhoneNumber] >= @p0) AND ([t0].[PhoneNumber] <= @p1)
于 2013-04-22T22:21:26.183 回答