Dynamic List Question

Posts   
 
    
exp2000
User
Posts: 68
Joined: 13-Apr-2006
# Posted on: 08-Sep-2006 00:59:24   

Can following query be created using dynamic list. I am not sure how to construct RelationPredicateBucket and PredicateExpressions.

SELECT  
        S.QueryId,
        Q.DateCreated,
        Q.LastRunDate,
        isnull (U2.Name, U1.Name) as Name,
        isnull (U2.Description, U1.Description) as Description,
        isnull (U2.TabModuleId, U1.TabModuleId) as TabModuleId
FROM SharedUserQuery S 
INNER JOIN Query Q ON S.QueryId = Q.QueryId
INNER JOIN UserQuery U1 ON U1.QueryId=S.QueryId and U1.UserId=S.FromUserId
LEFT OUTER JOIN UserQuery U2 ON U2.QueryId=S.QueryId and U2.UserId=S.ToUserId
LEFT OUTER JOIN HiddenUserSharedQuery H ON H.HiddenFromUserId=S.ToUserId AND H.QueryId=S.QueryId
WHERE S.ToUserId=4 AND H.HiddenFromUserId is null
Walaa avatar
Walaa
Support Team
Posts: 14995
Joined: 21-Aug-2005
# Posted on: 08-Sep-2006 07:00:03   

The predicateExpression is a FieldCompareValuePredicate plus a FieldCompareNullPredicate.

((SharedUserQueryFields.ToUserId == 4) & (HiddenUserSharedQueryFields == System.DBNull.Value))

What have you tried for the RelationPredicateBucket?, and what went wrong?.

Remember you can always examine the corresponding generated query, please refer to LLBLGen Pro manual "Using the generated code -> Troubleshooting and debugging"

exp2000
User
Posts: 68
Joined: 13-Apr-2006
# Posted on: 08-Sep-2006 17:48:32   

For one thing it does not join on the table for which I create relation on the fly (left join on UserQuery and HiddenUserSharedQuery.

Here is code:

 Dim toReturn As New DataTable

            Dim adapter As New DataAccessAdapter

            Dim fields As New ResultsetFields(5)
            fields.DefineField(SharedUserQueryFieldIndex.QueryId, 0, "QueryId", "SharedQuery")
            fields.DefineField(QueryFieldIndex.DateCreated, 1, "DateCreated", "Query")
            fields.DefineField(QueryFieldIndex.LastRunDate, 2, "LastRunDate", "Query")
            fields.DefineField(UserQueryFieldIndex.Name, 3, "Name", "UserQuery")
            fields.DefineField(UserQueryFieldIndex.Description, 4, "Description", "UserQuery")

            Dim bucket As New RelationPredicateBucket
            'join to Query
            bucket.Relations.Add(SharedUserQueryEntity.Relations.QueryEntityUsingQueryId, "", "", JoinHint.Inner)
            'join to UserQuery
            bucket.Relations.Add(UserQueryEntity.Relations.SharedUserQueryEntityUsingFromUserIdQueryId, "", "", JoinHint.Inner)

            'create relationon on the fly to UserQuery for ToUserId
            Dim relation As IEntityRelation = New EntityRelation(RelationType.OneToMany)
            relation.StartEntityIsPkSide = True
            relation.AddEntityFieldPair(EntityFieldFactory.Create(UserQueryFieldIndex.UserId), EntityFieldFactory.Create(SharedUserQueryFieldIndex.ToUserId))
            relation.AddEntityFieldPair(EntityFieldFactory.Create(UserQueryFieldIndex.QueryId), EntityFieldFactory.Create(SharedUserQueryFieldIndex.QueryId))
            relation.InheritanceInfoPkSideEntity = InheritanceInfoProviderSingleton.GetInstance().GetInheritanceInfo("UserQueryEntity", True)
            relation.InheritanceInfoFkSideEntity = InheritanceInfoProviderSingleton.GetInstance().GetInheritanceInfo("SharedUserQueryEntity", False)

            'create relation on the fly to HiddenUserSharedQuery 
            bucket.Relations.Add(relation, JoinHint.Left)
            Dim relation2 As IEntityRelation = New EntityRelation(RelationType.OneToOne)
            relation.StartEntityIsPkSide = True
            relation.AddEntityFieldPair(SharedUserQueryFields.ToUserId, HelperClasses.HiddenUserSharedQueryFields.HiddentFromUserId)
            relation.AddEntityFieldPair(SharedUserQueryFields.QueryId, HiddenUserSharedQueryFields.QueryId)
            relation.InheritanceInfoPkSideEntity = InheritanceInfoProviderSingleton.GetInstance().GetInheritanceInfo("SharedUserQueryEntity", True)
            relation.InheritanceInfoFkSideEntity = InheritanceInfoProviderSingleton.GetInstance().GetInheritanceInfo("HiddenUserSharedQueryEntity", True)
            bucket.Relations.Add(relation, JoinHint.Left)

            Dim filter As New PredicateExpression
            filter.Add(PredicateFactory.CompareValue(UserQueryFieldIndex.UserId, ComparisonOperator.Equal, sharedToUserId))
            filter.AddWithAnd(PredicateFactory.CompareNull(HiddenUserSharedQueryFieldIndex.HiddentFromUserId))
            bucket.PredicateExpression.Add(filter)

            adapter.FetchTypedList(fields, toReturn, bucket, False)

Here is query ouput

Generated Sql query: 
    Query: SELECT DISTINCT [SharedQuery].[QueryId], [Query].[DateCreated], [Query].[LastRunDate], [UserQuery].[Name], [UserQuery].[Description] FROM (( [db_MindSphere_PCA_InfoCenter].[dbo].[Query]  INNER JOIN [db_MindSphere_PCA_InfoCenter].[dbo].[SharedUserQuery]  ON  [db_MindSphere_PCA_InfoCenter].[dbo].[Query].[QueryId]=[db_MindSphere_PCA_InfoCenter].[dbo].[SharedUserQuery].[QueryId]) INNER JOIN [db_MindSphere_PCA_InfoCenter].[dbo].[UserQuery]  ON  [db_MindSphere_PCA_InfoCenter].[dbo].[UserQuery].[UserId]=[db_MindSphere_PCA_InfoCenter].[dbo].[SharedUserQuery].[FromUserId] AND [db_MindSphere_PCA_InfoCenter].[dbo].[UserQuery].[QueryId]=[db_MindSphere_PCA_InfoCenter].[dbo].[SharedUserQuery].[QueryId]) WHERE ( ( ( [db_MindSphere_PCA_InfoCenter].[dbo].[UserQuery].[UserId] = @UserId1 AND [db_MindSphere_PCA_InfoCenter].[dbo].[HiddenUserSharedQuery].[HiddentFromUserId] IS NULL)))
    Parameter: @UserId1 : Int32. Length: 0. Precision: 10. Scale: 0. Direction: Input. Value: 4.
Method Exit: CreateSelectDQ
exp2000
User
Posts: 68
Joined: 13-Apr-2006
# Posted on: 09-Sep-2006 15:02:20   

Ok, this might be a reason maybe. I had a misspelling for the column Hidden when I generated code. In the mean time spelling was fixed in db, but code not regenerated. That might be a reason.