2012-07-13 46 views
1

我得的LINQ to NHibernate的查询:的LINQ to NHibernate的的compareTo不支持

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 a和a之间的id?

回答

4

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

所以,如果你写的扩展名之间,你的代码看起来是这样的:

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

lista = listka.ToList(); 

这里有一些链接,让你开始:

+0

你的第一和第五个链接是相同的。也许你愿意链接到你的第一个http://fabiomaulo.blogspot.fr/2010/07/nhibernate-linq-provider-extension.html。并且您可能希望将http://weblogs.asp.net/ricardoperes/custom-linq-extensions-for-nhibernate添加到列表中,这是添加一些SQL函数支持的最轻的方法。 – 2016-03-24 06:58:33

+0

@Frédéric谢谢。你是对的。修复了链接并添加了新的“NHibernate自定义LINQ扩展”链接。 – 2016-03-24 11:20:09

-1

有了这样的疑问,您可以通过简单地使用大于号(>)或小于(<)运营商避免比较而不是String.Compare。例如:

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

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

+0

运算符'>'不能应用于'string'和'string'类型的操作数, – Chad 2014-03-03 16:10:26

0

在NHibernate v3.3.3中,支持String.Compare。 Where表达式中的String.Compare(MyProp, "value") > 0将生成类似于where MyProp > 'value'的sql。

相关问题