我在我的数据库中存储邮政编码并尝试将以下T-SQL转换为Linq到实体:
SELECT *
FROM Regions
WHERE EndZip >= '12345'
我尝试使用以下代码:
var result = this.DbContext.Regions.Where(e => e.EndZip.CompareTo("12345") >= 0);
但是我得到一个EntityCommandExecutionException:"没有为类型&SystemString'定义二元运算符GreaterThanOrEqual。和' System.String'。"
如果我将IQueryable转换为IEnumerable,我能够做到这一点,但我希望这个查询在SQL中由性能原因执行。
有谁知道我如何比较Linq中的字符串与实体?
答案 0 :(得分:1)
Linq to Entities中支持一组受限制的功能。 字符串比较是有限的。
Linq to entity Docu 然后看里面的链接 Supported Linq to Entity functions
介绍说大部分内容
本节提供有关LINQ to Entities查询支持或不支持的语言集成查询(LINQ)标准查询运算符的信息。许多LINQ标准查询运算符都有一个接受整数参数的重载版本。整数参数对应于正在操作的序列中的从零开始的索引,IEqualityComparer或IComparer。除非另有说明,否则不支持LINQ标准查询运算符的这些重载版本,尝试使用它们将引发异常。
答案 1 :(得分:0)
虽然我一般会考虑将ZipCode视为一个数字(而不是一个字符串),这是一个特别令人发指的事情,在这种情况下,它似乎有效:
from e in DbContext.Regions
where Convert.ToInt32(a.EndZip) >= 12345
select e
更新:
由于将有加拿大邮政编码(我们假设我们不希望在我们的“> = 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
}
}
现在,当然,如果你想在搜索中涉及加拿大代码(例如>= 'H0H 0H0'
),那么你有一个全新的问题,我没有看到任何明显的答案,但如果你可以限制自己只用第一个字符(即>= '20000'
)进行细分,然后你可以这样做:
from e in DbContext.Regions
where e.EndZip[0] >= '2'
select e;
答案 2 :(得分:0)
使用string.CompareTo 工作,至少使用我使用的设置(Linq v4.0.30319,Microsoft SQL Server Standard v12.0.5540,Entity Framework v6.1.3):
from e in DbContext.Regions
where e.EndZip.CompareTo("12345") <= 0
select e
但是,根据我的经验,它只适用于将CompareTo与整个字段一起使用(至少,它不能与SubString一起使用)。
因此,此方法不适用于英国邮政编码。