Anh*_* Ta 2 .net c# linq nhibernate fluent-nhibernate
我使用S#arpLite开发webapp来构建查询从许多表中获取列表.使用NHibernate版本3.3.1.4000
我在应用程序运行时遇到错误,例如
`NHibernate System.NotSupportedException Specified method is not supported. {Name = "PolymorphicQuerySourceDetector" FullName = "NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector"}
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process(IASTNode ast, ISessionFactoryImplementor factory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
at Remotion.Linq.QueryableBase`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at EzLife.Tasks.EmployeeCudTasks.GetEmployees(List`1 listSkill, List`1 listDepartment, List`1 listAssignment, String searchTerm, String jobtitle, String tier, String competency, Nullable`1 startDate, Nullable`1 endDate, Int32 effort, Nullable`1 active, Int32 currentPage, Int32 pageSize, Int32 sortId, Int32 sortName, Int32 sortTitle, Int32 sortTier, Int32 sortJoinedDate, Int32 sortDepartment) in d:\Projects\EzLife\_source\Ezlife\app\EzLife.Tasks\EmployeeCudTasks.cs:line 206`
这是我的代码
`public static IQueryable GetEmployeesQ(this IQueryable employees, IQueryable employeeTitles, int currentPage,int pageSize)
{
var query = from employee in employees
join employeeTitle in employeeTitles
on employee.Id equals employeeTitle.Employee.Id
select new EmployeeDto()
{
Id = employee.Id,
CustomCode = employee.CustomCode,
FirstName = employee.FirstName,
LastName = employee.LastName,
MiddleName = employee.MiddleName,
FullName = string.Empty,
JoinedDate = employee.JoinedDate,
};
return query;
}
public static IQueryable GetEmployeeTitlesQ(this IQueryable employeeTitles)
{
return from et1 in employeeTitles
join et2 in
(
from et in employeeTitles
orderby et.Employee.Id, et.StartDate
group et by et.Employee.Id into etmax
select new { Id = etmax.Max(et => et.Id) }
) on et1.Id equals et2.Id
select et1;
}`
I call GetEmployeeTitlesQ in GetEmployeesQ as :
'
public IList GetEmployees(int currentPage = 1, int pageSize = 20)
{
IList<EmployeeDto> employees = new List<EmployeeDto>();
IQueryable<EmployeeTitle> employeeTitles = employeeTitleRep.GetAll().GetEmployeeTitlesQ();
IQueryable<EmployeeDto> employeeDto = employeeRep.GetAll().GetEmployeesQ(
employeeTitles
, jobTitles
, currentPage
, pageSize);
try
{
employees = employeeDto.ToList();
}
catch (Exception ex) {
var mess = ex.Message.ToString();
}
return employees;
}
Run Code Online (Sandbox Code Playgroud)
'我猜Max()函数存在问题,但我不知道为什么.有什么方法可以解决它吗?
NHibernate无法将每个LINQ查询转换为SQL.对我来说,重新安排我where和join陈述的顺序就足够了.
| 归档时间: |
|
| 查看次数: |
2753 次 |
| 最近记录: |