在LINQ中进行字符串比较的问题

时间:2009-02-23 16:17:28

标签: c# .net sql linq

我无法让LINQ将某些内容翻译成我需要的查询。在T-SQL中,我们对作为CHAR(6)列的三列进行< =和> =比较。

后,LINQ不允许我这样做
  

运算符'< ='无法应用于   'string'类型的操作数为'string'。

我有以下T-SQL查询..

SELECT * 
FROM [ZIPMASTER] zm
WHERE zm.CORP = 12 
AND '85546 ' BETWEEN zm.ZIPBEG AND zm.ZIPEND

由于不支持BETWEEN,所以上面的LINQ不是很友好。因此,我已简化为以下内容:

SELECT *
FROM [ZIPMASTER] zm
WHERE zm.CORP = 12
AND zm.ZIPBEG <= '85546 '
AND zm.ZIPEND >= '85546 '

我曾经用它来创建以下LINQ查询:

var zipLinqQuery =
    from z in db.ZIPMASTERs
    where z.CORP == 12
    && z.ZIPBEG <= "85546 "
    && z.ZIPEND >= "85546 "
    select z;
List<ZIPMASTER> zips = zipLinqQuery.ToList<ZIPMASTER>();

C# - LINQ不太喜欢这个查询。我尝试转换为整数然后进行比较,但在某些情况下,邮政编码可能包含一个字母。例如,以下表达式将在T-SQL中评估为true:

WHERE '85546B' BETWEEN '85546A' AND '85546D'

我不确切知道它在T-SQL中的确切原因,但我的猜测是它通过将数组转换为数字ASCII值来单独比较数组中的每个字符。

无论如何,非常感谢您提供的任何帮助。提前谢谢。

CJAM

解决方案(由Jon Skeet发布):

看来string.CompareTo()确实生成了所需的T-SQL。以下示例:

var zipLinqQuery =
    from z in db.ZIPMASTERs
    where z.CORP == listItem.CORP
    && z.ZIPBEG.CompareTo(listItem.ZIPCODE) <= 0
    && z.ZIPEND.CompareTo(listItem.ZIPCODE) >= 0
    select z;

生成以下T-SQL:

DECLARE @p0 INT, @p1 CHAR(6), @p2 CHAR(6)
SET @p0 = 12
SET @p1 = '85546 '
SET @p2 = '85546 '

SELECT [t0].[CORP], [t0].[ZIPEND], [t0].[ZIPBEG], [t0].[CITY], [t0].[STATE], [t0].[CYCLE]
FROM [dbo].[ZIPMASTER] AS [t0]
WHERE ([t0].[CORP] = @p0) AND ([t0].[ZIPBEG] <= @p1) AND ([t0].[ZIPEND] >= @p2)

1 个答案:

答案 0 :(得分:39)

尝试:

var zipLinqQuery =
    from z in db.ZIPMASTERs
    where z.CORP == 12
    && z.ZIPBEG.CompareTo("85546 ") <= 0
    && z.ZIPEND.CompareTo("85546 ") >= 0
    select z;

知道 String.CompareTo在LINQ to SQL中工作,但这是首先尝试的。

(通常你应该使用StringComparer指定正确的比较类型,但我怀疑在这种情况下CompareTo是更好的选择。)