Условный оператор в выражении Linq вызывает исключение NHibernate - PullRequest
6 голосов
/ 19 марта 2012

Я пытаюсь реализовать функцию поиска в приложении 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, поэтому любая помощь будет принята с благодарностью!

1 Ответ

10 голосов
/ 19 марта 2012

А как насчет динамического создания вашего запроса?Например:

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);

Я не знаю, работает ли это, но я думаю, что это может быть более эффективным.

...