今天说一下,平时用表达式树时,遇到的坑。
在表达式使用过程中,是从列表中先筛选出一条然后再得到一个属性,还是先select出一个属性再筛选出一条,两者谁先谁后。
如下先筛选出一条然后再得到一个属性:solutionUserMapping.FirstOrDefault().SolutionCode
this.BusinessLightDataBase.Query<MonitorSolution, dynamic>(session =>
{
var solutionUserMapping = session.Query<MonitorSolutionUserMapping>().Where(m => m.UserId == user.UCloudId);
return session.Query<MonitorSolution>().Where(m => m.Code == solutionUserMapping.FirstOrDefault().SolutionCode).ToList();
});
这样后报错,具体信息如下:
“NHibernate.Hql.Ast.ANTLR.QuerySyntaxException”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理
其他信息: A recognition error occurred.
如果先select出一个属性再筛选出一条:solutionUserMapping.Select(s => s.SolutionCode).First()
this.BusinessLightDataBase.Query<MonitorSolution, dynamic>(session =>
{
var solutionUserMapping = session.Query<MonitorSolutionUserMapping>().Where(m => m.UserId == user.UCloudId);
return session.Query<MonitorSolution>().Where(m => m.Code == solutionUserMapping.Select(s => s.SolutionCode).FirstOrDefault()).ToList();//.Query<MonitorSolution>().Where(m => m.Code == solutionUserMapping.FirstOrDefault().SolutionCode).ToList();
});
这样就可以解决错误。
至于背后的原因,接下来找时间再做深究。谁知道原因也可以回答一下。
最后优化为下面这样:
this.BusinessLightDataBase.Query<MonitorSolution, MonitorSolution>(session =>
{
var solutionUserMapping = session.Query<MonitorSolutionUserMapping>().Where(m=>m.UserId==user.UCloudId);
return session.Query<MonitorSolution>().Where(m => solutionUserMapping.Select(s => s.SolutionCode).Contains(m.Code)).FirstOrDefault();
});