LINQ to Entities无法识别方法' Int32 CompareTo(System.String)'方法

时间:2017-03-20 10:13:57

标签: c# .net entity-framework linq

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

  

&#34; LINQ to Entities无法识别方法&#39; Int32 CompareTo(System.String)&#39;方法,并且此方法无法转换为商店表达式。&#34;

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

编辑:我在查询的地方使用specification system。我之前从来没有遇到任何问题,但经过仔细研究,可能与他们有关。

简单规范的一个例子是:

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

此AdHocSpecification基本上返回Expression&gt;立即(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())

1 个答案:

答案 0 :(得分:1)

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

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