我无法让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
以上不是LINQ友好,因为没有支持BETWEEN
.因此,我简化为以下内容:
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; Listzips = 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 && 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)
Jon Skeet.. 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是更好的选择.)
尝试:
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是更好的选择.)