2014-11-20 74 views
2

我存储在我的数据库邮政编码,并试图下面的T-SQL转换为LINQ到实体比较:字符串在LINQ到实体

SELECT * 
FROM Regions 
WHERE EndZip >= '12345' 

我试图像下面的代码:

var result = this.DbContext.Regions.Where(e => e.EndZip.CompareTo("12345") >= 0); 

但我得到一个EntityCommandExecutionException:“二进制运算符GreaterThanOrEqual没有为'System.String'和'System.String'类型定义。”

我能够做到这一点,如果我将我的IQueryable转换为IEnumerable,但我希望这个查询在SQL中执行的性能原因。

有谁知道我可以如何比较LINQ到实体的字符串?

+0

您是否在尝试查找大于指定邮政编码的邮政编码?试图了解目标。 – CmdrTallen 2014-11-20 18:38:41

+0

这是正确的。我们正在存储具有邮政编码范围的记录,并试图查找给定邮政编码落在记录范围内的记录。 – jawang35 2014-11-20 18:39:45

+0

我相信你的实际问题是试图使用'String'的'CompareTo'方法,这是LINQ to Entities不支持的。 – galenus 2014-11-20 18:40:10

回答

1

Linq to Entities支持一组有限的函数。 字符串比较是有限的。

Linq to entity Docu 然后看到里面的链接 Supported Linq to Entity functions

的介绍说,大部分

本节提供有关支持或不支持的语言集成查询(LINQ)标准查询运算符的信息LINQ to Entities查询。许多LINQ标准查询运算符都有一个接受整数参数的重载版本。整数参数对应于正在操作的序列中的从零开始的索引,IEqualityComparer或IComparer。除非另有说明,否则LINQ标准查询操作符的这些重载版本不受支持,试图使用它们将引发异常。

0

虽然我会,在一般情况下,考虑治疗邮编为数字(而不是作为一个字符串),是做一个特定的令人发指的事情,在这种情况下,它似乎工作:

from e in DbContext.Regions 
where Convert.ToInt32(a.EndZip) >= 12345 
select e 

UPDATE:

由于将有加拿大邮政编码(我们假定我们不希望在我们的 “> = 12345” 的搜索结果:

from e in DbContext.Regions 
where DbContext.IsNumeric(a.EndZip) && Convert.ToInt32(a.EndZip) >= 12345 
select e 

为了得到那个工作,你需要让LINQ的了解则IsNumeric现在

partial class MyDataContext 
{ 
    [Function(Name = "ISNUMERIC", IsComposable = true)] 
    public int IsNumeric(string input) 
    { 
     throw new NotImplementedException(); // this won't get called 
    } 
} 

,当然,如果你想参与搜索加拿大码(例如那么你有一个全新的问题,我没有看到任何明显的答案,但是如果你可以限制自己仅仅通过第一个字符进行分割(即>= '20000'),那么你可以做这样的事情:

from e in DbContext.Regions 
    where e.EndZip[0] >= '2' 
    select e; 
+0

不幸的是,我们还存储了一些国际邮政编码,如加拿大,其中包括字母:T – jawang35 2014-11-20 21:46:17