+1  A: 

If you using the generator in VS (ie, drap drop the data table and diagram and keys are all set in db), then the thing you are asking could be already there automatically.

e.g.

from Person in Context.Persons
where Person.Name == "PETER PAN"
select Person.User.Role.RoleName;

Exact name need to refer to the code generator, but this is the idea. Linq to entities will help to map foreign keys and those for you.

Edit

Actually I haven't tried using include. But according to msdn:include method, the include should show the object hierarchy to work. So, for your query to work, try:

from c in db.Persons.Include("aspnet_Users").Include("aspnet_Roles")
    where c.aspnet_Users.aspnet_Roles.RoleName == "Role" select c

And moreover, will you consider start from roles?

from r in db.aspnet_Roles
where r.RoleName == "ROLE"
select r.aspnet_Users.Persons
xandy
what i was orginally looking for was all users in a particular role not the role for each person. The problem with doing that was that aspnet_Users.aspnet_Roles.RoleName was not available for some reason...
You mean mapping all users that belongs to a particular group, right? Could you post more here to see why it's not working?
xandy
return (from c in db.Persons.Include("aspnet_Users") where c.aspnet_Users.aspnet_Roles.RoleName == "Role" select c); is what i was querying with, RoleName however doesn't seem to exist... ("Role" is just a placeholder, i use an actual role when querying)
Check the edited answer.
xandy
i thought about starting from roles and figured that would work, but i wanted to return a person. I though the syntax for include was to space the related tables using a dot syntax but will try with multiple include methods.
No, no good doing it like that either, you would have to think there is a solution for something that is so simple when using sql joins.
Can't use the roles option you provided either can't navigate from aspnet_Users to Persons...
Just a thought, have you test whether the entity is correct? like can you simply do (from u in db.aspnet_Users where UserName = "dfklds" select u.Persons) ?
xandy
(from u in db.aspnet_Users where u.UserName == "dfklds" select u.Persons) that works yes
+1  A: 
(from u in db.aspnet_Users.Include("Person") 
 from c in db.aspnet_Roles 
 where c.RoleName == "role" 
 select u.Persons);

Worked it out thanks for trying though.

it still feels a little unnatural to write something like that after writing sql for so long...
return (from u in db.Persons from c in db.aspnet_Roles where c.RoleName == "" select u); even better version
I've using Linq 2 Sql for some time and to me it is quite natural (except that when you need to think about performance). The only major different is that try not to think in sql's way when using Linq, and your question is quite unusual and I am sure in Linq 2 Sql I never encounter such situation (and I even never used Include before)
xandy