Problems with dynamic build of sort expressions

Posts   
 
    
stoneyowl avatar
stoneyowl
User
Posts: 62
Joined: 29-Jan-2004
# Posted on: 18-Aug-2006 15:59:11   

(This is a continuation of a thread I started in 'Generated Code' - I think it fits better here...)

Version 1.2005.1, Self Servicing - runtime libraries of 7/19/2006

When I create a sort Expression from user supplied table ('tname') and column names ('cname'), using the following code (note that 'tname' and 'cname' have been CamelCased by another method prior to use here):


      Assembly data = Assembly.LoadFrom("AARTSR7A.dll");
      tname += "Entity";
      Type entitytype = data.GetType("AARTSR7A.EntityClasses." + tname);
      IEntity entity = (IEntity)Activator.CreateInstance(entitytype);
      IEntityFieldCore field = entity.Fields[cname];

      SortOperator sop = SortOperator.Ascending;
      if (rbDown.Checked)
        sop = SortOperator.Descending;
      mSortExpr.Add(new SortClause(field, null, sop));

Applying the resulting SortExpression to a collection results in a 'Null reference' error somewhere deep in the SQL DQE. The stack trace is


   at SD.LLBLGen.Pro.DQE.SqlServer.SqlServerSpecificCreator.CreateObjectName(IFieldPersistenceInfo persistenceInfo)
   at SD.LLBLGen.Pro.DQE.SqlServer.SqlServerSpecificCreator.CreateFieldName(IFieldPersistenceInfo persistenceInfo, String fieldName, String objectAlias, Boolean appendAlias, String containingObjectName)
   at SD.LLBLGen.Pro.ORMSupportClasses.DynamicQueryEngineBase.AppendOrderByClause(StringBuilder queryText, ISortExpression sortClauses)
   at SD.LLBLGen.Pro.DQE.SqlServer.DynamicQueryEngine.CreateSelectDQ(IEntityFieldCore[] selectList, IFieldPersistenceInfo[] fieldsPersistenceInfo, IDbConnection connectionToUse, IPredicate selectFilter, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IRelationCollection relationsToWalk, Boolean allowDuplicates, IGroupByCollection groupByClause, Boolean relationsSpecified, Boolean sortClausesSpecified)
   at SD.LLBLGen.Pro.ORMSupportClasses.DynamicQueryEngineBase.CreateSelectDQ(IEntityFieldCore[] selectList, IFieldPersistenceInfo[] fieldsPersistenceInfo, IDbConnection connectionToUse, IPredicate selectFilter, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IRelationCollection relationsToWalk, Boolean allowDuplicates, IGroupByCollection groupByClause)
   at SD.LLBLGen.Pro.DQE.SqlServer.DynamicQueryEngine.CreatePagingSelectDQ(IEntityFieldCore[] selectList, IFieldPersistenceInfo[] fieldsPersistenceInfo, IDbConnection connectionToUse, IPredicate selectFilter, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IRelationCollection relationsToWalk, Boolean allowDuplicates, IGroupByCollection groupByClause, Int32 pageNumber, Int32 pageSize)
   at SD.LLBLGen.Pro.ORMSupportClasses.DynamicQueryEngineBase.CreateSelectDQ(IEntityFields selectList, IDbConnection connectionToUse, IPredicate selectFilter, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IRelationCollection relationsToWalk, Boolean allowDuplicates, IGroupByCollection groupByClause, Int32 pageNumber, Int32 pageSize)
   at SD.LLBLGen.Pro.ORMSupportClasses.DaoBase.PerformGetMultiAction(ITransaction containingTransaction, IEntityCollection collectionToFill, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IValidator validatorToUse, IPredicate selectFilter, IRelationCollection relations, Int32 pageNumber, Int32 pageSize)
   at SD.LLBLGen.Pro.ORMSupportClasses.DaoBase.GetMulti(ITransaction containingTransaction, IEntityCollection collectionToFill, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IEntityFactory entityFactoryToUse, IValidator validatorToUse, IPredicate selectFilter, IRelationCollection relations, Int32 pageNumber, Int32 pageSize)
   at SD.LLBLGen.Pro.ORMSupportClasses.EntityCollectionBase.GetMulti(IPredicate selectFilter, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses, IRelationCollection relations, Int32 pageNumber, Int32 pageSize)
   at SD.LLBLGen.Pro.ORMSupportClasses.EntityCollectionBase.GetMulti(IPredicate selectFilter, Int64 maxNumberOfItemsToReturn, ISortExpression sortClauses)
   at AARTS2006.MasterTables.MTController.LoadTableRecords() in C:\Documents and Settings\thomas.n.hill1\My Documents\Visual Studio 2005\Projects\AARTS2006\MasterTables\MTController.cs:line 106

The SortExpression object's internal list element(s) show a 'FieldToSort' property is null, and the FieldToSortCore' property contains the added SortClause.

Walaa avatar
Walaa
Support Team
Posts: 14950
Joined: 21-Aug-2005
# Posted on: 18-Aug-2006 16:20:29   

You are using SelfServicing and you are using an overload of the SortClause constructor that's supposed to be used in the Adapter model.

Overload list for SelfServicing:


public SortClause(IEntityField,SortOperator); 
public SortClause(IEntityField,SortOperator,string); 

Overload list for Adapter:

public SortClause(IEntityFieldCore,IFieldPersistenceInfo,SortOperator); 
public SortClause(IEntityFieldCore,IFieldPersistenceInfo,SortOperator,string);
stoneyowl avatar
stoneyowl
User
Posts: 62
Joined: 29-Jan-2004
# Posted on: 18-Aug-2006 17:30:33   

Excuse me while I whack myself with a LLBLGen manual. flushed

Another case of "how can I be so brainless when I am so smart!"

Thanks, everything works like a charm now.