SOQL - Querying for a list of users the current user is following

14,936

Try removing the parenthesis around the bind, i.e. change:

WHERE Id IN (:ids) 

to:

WHERE Id IN :ids

And also simplify the query by just making sure that your list of IDs doesn't contain the current user's ID:

List<EntitySubscription> sub = [SELECT ParentId 
  FROM EntitySubscription 
  WHERE SubscriberId = :UserInfo.getUserId() AND ParentId != :UserInfo.getUserId()
  LIMIT 1000];

Set<Id> ids = new Set<Id>();

for(EntitySubscription s : sub){
    ids.add(s.ParentId);
}

Hope that helps!

Share:
14,936
Ryan Elkins
Author by

Ryan Elkins

Co founder of IActionable.

Updated on July 26, 2022

Comments

  • Ryan Elkins
    Ryan Elkins almost 2 years

    In my app I display a list of the current users. I request it like this:

    Attempt 1

    List<User> Following = [SELECT Id, Name, SmallPhotoUrl 
      FROM User 
      WHERE Id IN (
          SELECT ParentId 
          FROM EntitySubscription 
          WHERE SubscriberId = :UserInfo.getUserId()) 
        AND Id != :UserInfo.getUserId() 
      LIMIT 96];
    

    This does exactly what it's supposed to when logged in as an admin but I found out that non-admins get an error:

    Implementation restriction: EntitySubscription only allows security evaluation for non-admin users when LIMIT is specified and at most 1000

    OK, no big deal, I'll just slap a LIMIT on there like so:

    Attempt 2

    List<User> Following = [SELECT Id, Name, SmallPhotoUrl 
      FROM User 
      WHERE Id IN (
          SELECT ParentId 
          FROM EntitySubscription 
          WHERE SubscriberId = :UserInfo.getUserId() 
          LIMIT 1000) 
        AND Id != :UserInfo.getUserId() 
      LIMIT 96];
    

    Easy, right? WRONG. This gives the following:

    expecting a right parentheses, found 'LIMIT'

    OK...

    I then tried breaking it out like so:

    Attempt 3

    List<EntitySubscription> sub = [SELECT ParentId 
      FROM EntitySubscription 
      WHERE SubscriberId = :UserInfo.getUserId() 
      LIMIT 1000];
    List<Id> ids = new List<Id>();
    for(EntitySubscription s : sub){
        ids.add(s.ParentId);
    }
    List<User> Following = [SELECT Id, Name, SmallPhotoUrl 
      FROM User 
      WHERE Id IN (:ids) 
        AND Id != :UserInfo.getUserId() 
      LIMIT 96]; 
    

    I crossed my fingers and...

    Invalid bind expression type of LIST<Id> for column of type Id
    

    Hmm, I'd seen examples where this seemed to be possible, such as on the developerforce boards, so I'm at a bit of a loss now.

    So here we are. I need to select a list of user names and pictures that a particular user is following on Chatter. If there is a completely different way to go about it I'm open to it.