将Linq中的字符串与实体进行比较

时间:2014-11-20 18:35:07

标签: c# linq entity-framework

我在我的数据库中存储邮政编码并尝试将以下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中的字符串与实体?

3 个答案:

答案 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一起使用)。

因此,此方法不适用于英国邮政编码。