I recently ran into a use case where I had to query a many-to-many realationship in an Microsoft CRM environment. Well, it's always not that easy as it maybe seems on the first view. After a couple time researching and trying around I found a solution which I'll share with you right here :-).
All you have to do is specify the entities and intersect entity name. In the result EntityCollection you'll receive a list of the specified LinkEntity - in my case a list of contacts.
string entity1 = Contact.EntityLogicalName;
string entity2 = Campaign.EntityLogicalName;
QueryExpression query = new QueryExpression(entity1);
LinkEntity linkEntity1 = new LinkEntity(entity1, [Intersect Entity Name], "contactid", "contactid", JoinOperator.Inner);
LinkEntity linkEntity2 = new LinkEntity([Intersect Entity Name], entity2, "campaignid", "campaignid", JoinOperator.Inner);