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

Posted

技术标签:

【中文标题】在 LINQ 中进行字符串比较的问题【英文标题】:Issues Doing a String Comparison in LINQ 【发布时间】:2010-10-09 08:36:26 【问题描述】:

我无法让 LINQ 将某些内容转换为我需要的查询。在 T-SQL 中,我们对 CHAR(6) 列的三列进行 = 比较。 LINQ 不允许我这样做,因为

运算符“

我有以下 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;
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】:

试试:

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

【讨论】:

这确实有效,但有什么方法可以从中制作通用扩展方法?我玩了一下,但想不出任何 L2S 可以翻译的东西。为 IEnumerables 工作过。

以上是关于在 LINQ 中进行字符串比较的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 和 Regex 比较 2 个字符串数组以进行部分匹配

将 Mongodb 中的日期与 C# LINQ 驱动程序进行比较

Linq中比较字符串类型的日期

使用LINQ按字母顺序比较字符串

在带有 LINQ to XML 的 VB.NET 中,where 子句在属性值和字符串之间设置不区分大小写的比较

如何使用 LINQ 查找包含 2 个逗号分隔的字符串的匹配项