Linq Expression中的条件运算符导致NHibernate异常

Bab*_*oto 6 c# linq nhibernate linq-to-nhibernate

我正在尝试在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
                                                            ); 
Run Code Online (Sandbox Code Playgroud)

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

IQueryable<Customer> customers = CustomerRepository.FilterBy(searchCriteria);
Run Code Online (Sandbox Code Playgroud)

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

System.InvalidCastException: Unable to cast object of type 'NHibernate.Hql.Ast.HqlCast' to type 'NHibernate.Hql.Ast.HqlBooleanExpression'
Run Code Online (Sandbox Code Playgroud)

根据这个问题,问题是在表达式中使用条件运算符.

所以我想我必须以其他方式创建Expression,但我不知道该怎么做.我对Linq很新,所以任何帮助都会被感激之情!

Bal*_*nyi 10

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

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);
Run Code Online (Sandbox Code Playgroud)

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

  • @Babakoto 这是 LINQ 的一个功能。直到您在“IQueryable”链末尾调用“ToList”或“SingleOrDefault”(或类似)方法时,才会评估您的查询,因此您可以动态地将任何过滤器添加到查询中。显式调用后,查询处理器(如 NHibernate)会将整个查询链转换为 SQL 表达式。 (2认同)