【问题标题】:Unable to cast object of type 'NHibernate.Hql.Ast.HqlCast' to type 'NHibernate.Hql.Ast.HqlBooleanExpression无法将“NHibernate.Hql.Ast.HqlCast”类型的对象转换为“NHibernate.Hql.Ast.HqlBooleanExpression”类型
【发布时间】:2011-12-03 14:56:49
【问题描述】:

我正在使用以下 c# 代码:

public IList<T> GetAllByExpression(Expression<Func<T, bool>> expression, int startIndex, int count, Func<T, DateTime> dateTimeSelector)
{
    using (ISession session = NHibernateHelper.GetSession())
    {
        return session.Query<T>()
            .Where(expression)
            .OrderBy(dateTimeSelector)
            .Skip(startIndex - 1)
            .Take(count)
            .ToList();
    }
}

更新: 甚至下面的代码也会抛出同样的异常:

public IList<T> GetAllByExpression(Expression<Func<T, bool>> expression, int startIndex, int count, Expression<Func<T, DateTime>> dateTimeSelector)
{
    using (ISession session = NHibernateHelper.GetSession())
    {
        return session.Query<T>()
            .Where(expression)
            //.OrderBy(dateTimeSelector)
            //.Skip(startIndex - 1)
            //.Take(count)
            .ToList();
    }
}

并得到 Nh 错误:

无法将“NHibernate.Hql.Ast.HqlCast”类型的对象转换为类型 'NHibernate.Hql.Ast.HqlBooleanExpression'。

我做错了什么?

【问题讨论】:

  • 可能是您提供给失败的地方的表达式

标签: c# .net sql nhibernate


【解决方案1】:

问题是我在表达式中写了短条件: as ((a == null)? true : a > b) NH 转换在那个 (?) 上失败

【讨论】:

  • 可以确认这是问题所在。有同样的问题,重写表达式解决了这个问题。感谢分享!
  • 有关如何重写代码以避免此错误的一个很好的示例,您可以在此处查看答案:stackoverflow.com/questions/9774598/…
【解决方案2】:

您很可能在日期时间dateTimeSelector 谓词上错过了Expression&lt;&gt;

【讨论】:

  • 试图评论所有:.OrderBy(dateTimeSelector) .Skip(startIndex - 1) .Take(count),但没有帮助
  • 您的示例调用看起来如何?
  • 问题是我在表达式中写了简短的条件: as ((a == null)? true : a > b) NH 转换失败 (?)
  • 可能。尝试一些像a &gt; b 这样的微不足道的东西,它应该可以工作。当它在特定条件下(比如你的)失败时,这意味着表达式没有明显的 SQL 转换(hibernate linq 无法处理它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多