我有两个类(Request& RequestDetail)。我需要通过join来在两个类之间进行Linq To NHibernate
查询。
var q = SessionInstance.Query<Request>()
.Where(x => x.State == "Init");
var q2 = SessionInstance.Query<RequestDetail>();
q2 = q2.Where(xx => xx.Purpose.Contains("Purpose Sample")); // This line has a error When execution `q.ToList()`
q = q.Join(q2, request => request.Id, detail => detail.Id, (request, detail) => request);
return q.ToList();
当我向Where
添加q2
条件时,Result会出现运行时错误。异常消息是:Specified method is not supported.
堆栈追踪:
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.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.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.NhQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression)
at Remotion.Data.Linq.QueryableBase`1.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
为什么?
答案 0 :(得分:20)
这可能是一个错误。
以下是您的问题的解决方法:
var q = (from request in session.Query<Request>()
join detail in session.Query<RequestDetail>() on request.Id equals detail.Id
where request.State == "Init" && detail.Purpose.Contains("Purpose Sample")
select request).ToList();
答案 1 :(得分:3)
以流利的方式表达:
var q = session.Query<Request>()
.Join(session.Query<RequestDetail>(), request => request.Id, detail => detail.Id, (request, detail) => new {
r = request,
d = detail
})
.Where(rd => rd.r.State == "Init" && rd.d.Purpose.Contains("Purpose Sample"))
.Select(rd => rd.r)
.ToList();