Person、Employee1、Employee2 の 3 つのクラスがあります。
public class Employee1 : Person
{
}
public class Employee2 : Person
{
}
Employee1_Table または Employee_Table に参加する必要があるという Person_Table のクエリが必要です。
var q = SessionInstance.Query<Person>();
if (dto.Code != null) // A1 Condition
q = q.Where(x => x.Code == dto.Code);
//if(A2 Condition)
//if(A3 Condition)
//...
switch (dto.Type)
{
case PersonType.Employee1:
var q1 = SessionInstance.Query<Employee1>();
q.Join(q1, x => x.Id, xx => xx.Id, (x, xx) => x);
if (!String.IsNullOrEmpty(dto.Unit)) // B1 Condition
q1 = q1.Where(xx => xx.Unit == dto.Unit);
//if(B2 Condition)
//if(B3 Condition)
//...
return q1.ToList<Person>();
case PersonType.Employee2:
var q2 = SessionInstance.Query<Employee2>();
q.Join(q2, x => x.Id, xx => xx.Id, (x, xx) => x);
if (!String.IsNullOrEmpty(dto.Serial)) // C1 Condition
q2 = q2.Where(xx => xx.Serial == dto.Serial);
//if(C2 Condition)
//if(C3 Condition)
//...
return q2.ToList<Person>();
default:
return q.ToList();
}
この結合のクエリは不完全です。dto.TypeがPersonType.Employee1またはPersonType.Employee2と等しい場合、A1 , A2 , ...
影響しません。ただし、スイッチのデフォルトのケースでA1 , A2 , ...
は、クエリに影響があります。3 つの別々のクラスの Where 条件が多く、Where
クエリの条件を別々に追加する必要があります。なんで?
アップデート :
var q = SessionInstance.Query<Person>();
if (dto.Code != null) // A1 Condition
q = q.Where(x => x.Code == dto.Code);
//if(A2 Condition)
//if(A3 Condition)
//...
var q1 = SessionInstance.Query<Employee1>();
if (!String.IsNullOrEmpty(dto.Unit)) // B1 Condition
q1 = q1.Where(xx => xx.Unit == dto.Unit);
//if(B2 Condition)
//if(B3 Condition)
//...
return q.Join(q1, x => x.Id, xx => xx.Id, (x, xx) => x).ToList<Person>();
B1
条件が true の場合、この更新されたクエリには例外があります。この例外のメッセージ:指定されたメソッドはサポートされていません。
スタック トレースは次のとおりです。
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)