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

5
我将使用以下的C#代码:

我正在使用下面的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”。

我做错了什么?


可能是你提供给 Where 的表达式出了问题。 - Baz1nga
2个回答

6
问题在于我在表达式中写了一个简短的条件:((a == null)? true : a > b),这导致 NH 转换失败。

可以确认这是问题所在。我也遇到了同样的问题,重写表达式解决了问题。感谢分享! - Ales Potocnik Hahonina
一个很好的重写代码以避免这个错误的例子,你可以在这里查看答案:https://dev59.com/oGHVa4cB1Zd3GeqPpbay - humbads

1

很可能您在日期时间选择器的谓词dateTimeSelector中漏掉了Expression<>


尝试对所有内容进行注释: .OrderBy(dateTimeSelector) .Skip(startIndex - 1) .Take(count),但并没有起到帮助的作用。 - Elad Benda2
你的示例调用是什么样子的? - Wiktor Zychla
问题在于我在表达式中写了一个短条件:((a == null)? true : a > b),导致NH转换失败。 - Elad Benda2
可能。尝试一些微不足道的东西,比如 a > b,它应该可以工作。当它在特定条件下失败时(像你的情况),这意味着表达式没有明显的 SQL 翻译(Hibernate Linq 无法处理它)。 - Wiktor Zychla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接