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 は実際には数値比較を行っているのではなく、アルファ比較を行っています。ただし、すべて同じ長さの電話番号を使用しているため、その違いは重要ではありません。

ただし、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 に答える