5

我需要使用string.CompareOrdinal(...)linq 查询内部来比较字符串。

string max;
string min;

var res = db.Table
            .Where(c => string.CompareOrdinal(c.Id,  min) >= 0)
            .Where(c => string.CompareOrdinal(c.Id,  max) <= 0)
            .ToList();

代码抛出异常:

LINQ ti Entities 无法识别方法“Int32 CompareOrdinal(System.String, System.String)”方法,并且该方法无法转换为存储表达式。

表中有很多数据,所以我确实需要该where子句。

有没有解决的办法?

更新

我不想决定两个字符串是否相等 - 是否区分大小写。

我试图确定一个字符串是否在一个范围内。所以问题是

  • 有没有办法做到这一点 - 所以这适用于 L2E?

显然,我不能使用string.CompareOrdinal

4

2 回答 2

7

我的一位同事找到了一种解决方法,使用string.Compare而不是string.CompareOrdinal

string min = "a";
string max = "z";

 var res = db.Table
         .Where(c => string.Compare(c.Id, min, StringComparison.OrdinalIgnoreCase) >= 0)
         .Where(c => string.Compare(c.Id, max, StringComparison.OrdinalIgnoreCase) <= 0)
         .ToList();

这是生成的 SQL:

SELECT 
[Extent1].[Id] AS [Id]
FROM [dbo].[Table] AS [Extent1]
WHERE ([Extent1].[Id] >= 'a') AND ([Extent1].[Id] <= 'z')
于 2013-11-13T08:53:10.903 回答
0

如果 Id 是字符串,则此解决方案有效,因此看起来 Id 是 int。Int 不能与字符串进行比较。将 Id 更改为字符串或将 min/max 更改为 int 以使其工作(并在 int 值之间使用简单的 < 和 >)。

顺便说一句:它将节省 1 次迭代来检查 1 where 函数中的 min 和 max。

于 2013-07-29T19:19:42.793 回答