【发布时间】: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 => string.Compare(x.Street, _opsm.Street) <= 0
标签: c# .net entity-framework linq