在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 ' 

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

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

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 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] = @p2) 

尝试:

 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是更好的选择。)