【问题标题】:LINQ to Entities does not recognize the method 'Int32 CompareTo(System.String)' methodLINQ to Entities 无法识别方法“Int32 CompareTo(System.String)”方法
【发布时间】:2017-03-20 10:13:57
【问题描述】:

我想在我的 sql 查询中比较 2 个字符串。在此查询中,我希望所有值都大于特定值。所以在 SQL 中,这看起来像 where STREET > 'street'。在 linq 中,我在 where 子句中使用了它:x => x.Street.CompareTo(_opsm.Street) <= 0。但是,当我运行它时,我收到一条错误消息:

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

这是否意味着我不能在 EF 中使用这个比较器?

编辑:我们在 where 查询中使用 specification system。我以前从来没有遇到过这样的问题,但仔细研究后,它可能与它们有关。

一个简单规范的例子是这样的:

    var tempspec = new AdHocSpecification<Eenheid>(
                        x => string.Compare(x.Street, OverzichtPersonenSearch.Street, StringComparison.Ordinal) >= 0
                    );

这个 AdHocSpecification 基本上是立即返回 Expression>(AdHocSpec 的代码是here

奇怪的是,这行得通:

Een = (from ver in q1
        .Where(
            x =>
                x.PersoonsID == persoon.ComputerNr)
    join een in PagedView.Context.EENHEID
    on ver.Eenheid equals een.ComputerNr into h
        from een in h.DefaultIfEmpty()
        select een
).FirstOrDefault(x => string.Compare(x.Street, "02", StringComparison.Ordinal) >= 0)

但这不是:

Een = (from ver in q1
        .Where(
            x =>
                x.PersoonsID == persoon.ComputerNr)
    join een in PagedView.Context.EENHEID
    on ver.Eenheid equals een.ComputerNr into h
        from een in h.DefaultIfEmpty()
        select een
).FirstOrDefault(tempspec.IsSatisfied())

【问题讨论】:

  • @SergeyBerezovskiy 错误并没有这么说。 Int32 有 CompareTo 方法的返回类型。顺便说一句,代码在 EF6 中对我来说很好用。您使用的是什么版本的 EF?
  • 我们也使用 EF6。但是,这发生在子选择中。也许这可能是问题所在?
  • 您使用什么数据提供者? string.CompareTo 应该可以在默认的 SQL Server 客户端上正常工作。
  • 那么最好只显示完整的查询。并且提供者很重要(可能是 sql server、postgresql、mysql?)
  • 作为替代方案,您可以尝试使用x =&gt; string.Compare(x.Street, _opsm.Street) &lt;= 0

标签: c# .net entity-framework linq


【解决方案1】:

EF 正在将您的查询翻译成 SQL,并且只能翻译它明确支持的函数调用,显然不支持 Int32 CompareTo(System.String)

支持使用静态方法string.Compare(string, string)string.Compare(x.Street, _opsm.Street) &lt;= 0

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 2015-09-20
    • 2015-07-20
    • 2020-01-26
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多