我正在尝试在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,问题是在表达式中使用条件运算符。
所以我想我必须以其他方式创建Expression,但我不知道该怎么做。我对Linq很新,所以任何帮助都会被感激地接受!
答案 0 :(得分: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);
我不知道这是否有效,但我认为这可能更有效。