Ehs*_*san 3 c# linq nhibernate join linq-to-nhibernate
我有3个类:Person,Employee1,Employee2
public class Employee1 : Person
{
}
public class Employee2 : Person
{
}
Run Code Online (Sandbox Code Playgroud)
我需要查询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();
}
Run Code Online (Sandbox Code Playgroud)
此连接查询不完整.如果dto.Type等于PersonType.Employee1或PersonType.Employee2,A1 , A2 , ...则不会影响.但是默认情况下,switch 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>();
Run Code Online (Sandbox Code Playgroud)
如果B1condition为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)
Run Code Online (Sandbox Code Playgroud)
在非默认切换情况下,分别返回q1和q2.永远不会为这些查询分配任何涉及q的内容,这解释了为什么最终查询中不存在Ax条件的原因.
另外,考虑一下:
q.Join(q1, x => x.Id, xx => xx.Id, (x, xx) => x);
Run Code Online (Sandbox Code Playgroud)
与所有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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5929 次 |
| 最近记录: |