Relations aliases

Posts   
 
    
sgay
User
Posts: 53
Joined: 23-Nov-2006
# Posted on: 30-Apr-2008 19:01:41   

This has got to be a FAQ of some sort but for the sake of it I can't find the answer anywhere... Just spent ~2hr reading the forums and trying things and I'm lost. Must be tired. Can you help?

I have the following structure: User (Id,...) <-> UserRole (UserId,RoleId) <-> Role (Id,...) <-> Permission (RoleId,OperationId) <-> Operation (Id,...)

Find all users having at least one of some roles:

IRelationPredicateBucket rpb = ...;
IList<int> rolesAny = ...;
rpb.Relations.Add(UserEntity.Relations.UserRoleEntityUsingUserId);
rpb.PredicateExpression.Add(UserRoleFields.RoleId == rolesAny.ToArray());

Find all users having all of some roles--requires aliases:

IRelationPredicateBucket rpb = ...;
IList<int> rolesAll = ...;
foreach (int i in rolesAll)
{
    string a = string.Format("a{0}", i);
    
    rpb.Relations.Add(UserEntity.Relations.UserRoleEntityUsingUserId, a);
    rpb.PredicateExpression.Add(UserRoleFields.RoleId.SetObjectAlias(a) == i);
}

Find all users having at least one of some permissions:

IRelationPredicateBucket rpb = ...;
IList<int> operationsAny = ...;
rpb.Relations.Add(UserEntity.Relations.UserRoleEntityUsingUserId);
IEntityRelation rel = new EntityRelation(UserRoleFields.RoleId, PermissionFields.RoleId, RelationType.OneToMany);
rpb.Relations.Add(rel, JoinHint.Inner);
rpb.PredicateExpression.Add(PermissionFields.OperationId == operationsAny.ToArray());

Find all users having all of some permissions--requires aliases:

IRelationPredicateBucket rpb = ...;
IList<int> operationsAll = ...;
foreach (int i in operationsAll)
{
    string a = string.Format("a{0}", i);
    string b = string.Format("b{0}", i);

    rpb.Relations.Add(UserEntity.Relations.UserRoleEntityUsingUserId, a);

    // FIXME
    IEntityRelation rel = new EntityRelation(UserRoleFields.RoleId, PermissionFields.RoleId, RelationType.OneToMany);
    rpb.Relations.Add(rel, JoinHint.Inner);
    // FIXME

    rpb.PredicateExpression.Add(PermissionFields.OperationId.SetObjectAlias(b) == i);
}

Obviously the lines enclosed between FIXME need to be fixed with aliases, and I can not find how. Have tried various combinations of:

    IEntityRelation rel = new EntityRelation(
        UserRoleFields.RoleId.SetObjectAlias(a),
        PermissionFields.RoleId.SetObjectAlias(b),
        RelationType.OneToMany);

    rpb.Relations.Add(rel, a, b, JoinHint.Inner);

Still gives me the "Relation at index 1 doesn't contain an entity already added to the FROM clause. Bad alias?" exception.

Any idea?

sgay
User
Posts: 53
Joined: 23-Nov-2006
# Posted on: 30-Apr-2008 21:39:04   

Replying to myself... finally found a solution:

IRelationPredicateBucket rpb = ...;
IList<int> operationsAll = ...;
foreach (int i in operationsAll)
{
    string a = string.Format("a{0}", i);
    string b = string.Format("b{0}", i);

    rpb.Relations.Add(UserEntity.Relations.UserRoleEntityUsingUserId, a);

    IEntityRelation rel = new EntityRelation(
        UserRoleFields.RoleId,
        PermissionFields.RoleId,
        RelationType.OneToMany,
        true,
        string.Empty);
    rel.SetAliases(a, b);
    rpb.Relations.Add(rel, a, b, JoinHint.Inner);

    rpb.PredicateExpression.Add(PermissionFields.OperationId.SetObjectAlias(b) == i);
}

Many thanks to myself wink

Is this the "best" practice?

daelmo avatar
daelmo
Support Team
Posts: 8245
Joined: 28-Nov-2005
# Posted on: 01-May-2008 06:07:54   

Yes. You did a good job wink

David Elizondo | LLBLGen Support Team