我无法让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)
答案 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是更好的选择。)