【问题标题】:linq to nhibernate compareto not supported不支持 linq to nhibernate compareto
【发布时间】: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 之间?

【问题讨论】:

    标签: c# .net sql linq nhibernate


    【解决方案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();
    

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

    【讨论】:

    • 你的第一个和第五个链接是一样的。也许你愿意为你的第一个链接到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;
      

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

      【讨论】:

      • 运算符 '>' 不能应用于“字符串”和“字符串”类型的操作数
      猜你喜欢
      • 2013-10-29
      • 1970-01-01
      • 2012-05-12
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多