【问题标题】:Conditional operator in Linq Expression causes NHibernate exceptionLinq 表达式中的条件运算符导致 NHibernate 异常
【发布时间】:2012-03-20 03:26:48
【问题描述】:

我正在尝试在 ASP.NET MVC 2 应用程序中实现搜索功能。我根据用户输入的条件创建一个表达式:

public ViewResult FindCustomer( string forename, string familyname, DateTime? dob)
  {
  Expression<Func<Customer, bool>> searchCriteria = p => (
                                                            forename.IsNullOrEmpty() ? true : p.Forename == forename
                                                            && familyname.IsNullOrEmpty() ? true : p.FamilyNames.Any(n => n.Name == familyname)
                                                            && dob.HasValue ? true : p.DOB == dob
                                                            ); 

然后将其传递给存储库中的方法

IQueryable<Customer> customers = CustomerRepository.FilterBy(searchCriteria);

问题是当我运行它时,我得到以下异常

System.InvalidCastException: Unable to cast object of type 'NHibernate.Hql.Ast.HqlCast' to type 'NHibernate.Hql.Ast.HqlBooleanExpression'

根据this,问题是表达式中使用了条件运算符。

所以我想我必须以其他方式创建表达式,但我不知道该怎么做。我对 Linq 还很陌生,因此我们将不胜感激地接受任何帮助!

【问题讨论】:

    标签: c# linq nhibernate linq-to-nhibernate


    【解决方案1】:

    动态创建查询怎么样?像这样:

    var customers = CustomerRepository.AllEntities();
    
    if (!forename.IsNullOrEmpty())
        customers = customers.Where(p => p.Forename == forename);
    if (!familyname.IsNullOrEmpty())
        customers = customers.Where(p => p.FamilyNames.Any(n => n.Name==familyname));
    if (dob.HasValue)
        customers = customers.Where(p => p.DOB == dob);
    

    我不知道这是否有效,但我认为这可能更有效。

    【讨论】:

    • 行得通!非常感谢。我一直试图避免编写类似的东西,因为我想避免多次调用数据库,所以我认为我需要构造一个包含所有参数的单个表达式。使用您的解决方案只会执行一条 SQL 语句。这是 NHibernate 的一个特性吗?它从多个 LINQ 表达式构建 SQL 语句以最大限度地减少对数据库的调用?我想我需要更多地了解 NHibernate 和 LINQ!
    • @Babakoto 这是 LINQ 的一个特性。在您在 IQueryable 链的末尾调用 ToListSingleOrDefault(或类似)方法之前,不会评估您的查询,因此您可以动态地将任何过滤器添加到查询中。在显式调用之后,查询处理器(如 NHibernate)会将整个查询链转换为 SQL 表达式。
    • 太好了。再次感谢您的帮助
    • @Babakoto 我在使用 Entity 框架时使用过这样的表达式,它工作得很好。为什么它在 nHibernate 中不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 2018-02-20
    相关资源
    最近更新 更多