不支持 linq to nhibernate compareto

Posted

技术标签:

【中文标题】不支持 linq to nhibernate compareto【英文标题】:linq to nhibernate compareto not supported 【发布时间】:2012-07-13 00:45:24 【问题描述】:

我有 linq to nhibernate 查询:

var listka = 
    from i in FakturyZakupu.Queryable 
    where String.Compare(i.REJESTRY.REJ_KOD,sbWartoscBetween1.ToString()) >= 0 
    && String.Compare(i.REJESTRY.REJ_KOD,sbWartoscBetween2.ToString()) <= 0 
    select i;

lista = listka.ToList();   

而且它编译的很好,但是如果我使用它,就会抛出异常:

NotSupportedException int32 CompareTo(System.String, System.String)

如何在两个值之间使用 linq 查询字符串值。就像在 SQL 中一样: select * from table where id 在 a 和 b 之间?

【问题讨论】:

【参考方案1】:

NHibernate 的 Linq 提供者非常 extendable。您可以扩展它以允许任何表达式,只要您可以在 HQL 中编写该表达式,因为 NHibernate 的 Linq 正在转换为 HQL。

因此,如果您为 Between 编写扩展,您的代码可能如下所示:

var listka = 
    from i in FakturyZakupu.Queryable 
    where i.REJESTRY.REJ_KOD.Between(sbWartoscBetween1, sbWartoscBetween2) 
    select i;

lista = listka.ToList();

以下是一些帮助您入门的链接:

NHibernate Linq provider extension by Fabio Maulo Linq to NHibernate: String.Equals with StringComparison option NHibernate 3 - Extending the Linq Provider to fix some System.NotSupportedException NHibernate - Customize the Linq provider to call your user defined SQL functions Linq to NHibernate extensions Creating In and NotIn extension methods for NHibernate 3 Linq Provider Extend NHibernate-LINQ for Regex-Matching Custom LINQ Extensions for NHibernate

【讨论】:

你的第一个和第五个链接是一样的。也许你愿意为你的第一个链接到fabiomaulo.blogspot.fr/2010/07/…。并且您可能希望将weblogs.asp.net/ricardoperes/… 添加到您的列表中,这是添加一些 SQL 函数支持的最简单的方法。 @Frédéric 谢谢。你说得对。修复了链接并添加了新的“NHibernate 的自定义 LINQ 扩展”链接。【参考方案2】:

在 NHibernate v3.3.3 中,支持 String.Compare。 Where 表达式中的String.Compare(MyProp, "value") &gt; 0 会产生类似于where MyProp &gt; 'value' 的sql。

【讨论】:

【参考方案3】:

使用这样的查询,您可以通过简单地使用大于 (>) 或小于 (

var listka =
    from i in FakturyZakupu.Queryable
    where i.REJESTRY.REJ_KOD > sbWartoscBetween1.ToString() &&
    i.REJESTRY.REJ_KOD < sbWartoscBetween2.ToString()
    select i;

您的成功可能取决于您的数据库对字符串比较的解释,但通常应该可以正常工作。

【讨论】:

运算符 '>' 不能应用于“字符串”和“字符串”类型的操作数

以上是关于不支持 linq to nhibernate compareto的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to NHibernate - 如何检测失败的翻译

有利于启动; Linq to SQL 还是 Nhibernate?

Linq To Nhibernate 性能优化(入门级)

用 LINQ to SQL 或 LINQ to EF 替换 NHibernate

NHibernate 或 LINQ to SQL [关闭]

Linq to SQL VS 实体框架