linq如何在查询中通过连接和分离来hibernate



我有3个类:Person, Employee1, Employee2

public class Employee1 : Person
{
}
public class Employee2 : Person
{
}

我需要对Person_Table进行查询,有时需要加入Employee1_Table或Employee_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。Employee1PersonType。Employee2A1 , 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条件为真,则更新后的查询有一个异常。此异常的消息是:指定的方法不支持。

堆栈跟踪是:

   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)

在非默认开关情况下,分别返回q1和q2。这些查询从不分配任何涉及q的内容,这就解释了为什么Ax条件没有出现在最终查询中。

同样,考虑以下行:

q.Join(q1, x => x.Id, xx => xx.Id, (x, xx) => x);

与所有LINQ方法一样,Join方法()不会以任何方式影响q或q1,而是返回一个新的IQueryable。所编写的代码忽略了这个返回值,因此这一行对最终查询没有影响。

你在其他地方都有正确的模式,那就是:"q = q. something ...."。

您必须更改Join()以在其最后一个参数中返回新的{x, xx},以便您可以将. where()调用从q1移动到q,并且仍然可以访问q1中的项。比如:

var qJoined = q.Join(SessionInstance.Query<Employee1>(),
                     x => x.Id, xx => xx.Id,
                     (x, xx) => new {x, xx});
if (!String.IsNullOrEmpty(dto.Unit))   // B1 Condition
    qJoined = qJoined.Where(w => w.xx.Unit == dto.Unit);
return qJoined.Select(w => w.x).ToList();

相关内容

  • 没有找到相关文章

最新更新