Внутренний запрос будет сделан отдельно:
var inner = UserRoles.Where(r => r.user_id == 1)
.Select(r => r.role_id);
И тогда внешние будет использовать .Contains
метод внутреннего.
var roleNames = Roles.Where(r => inner.Contains(r.role_id))
.Select(r => r.roleName);
Вы можете объединить все это в один запрос, но это самый надежный способ сделать это. Entity Framework использует отложенные запросы, поэтому он все равно будет делать это эффективно.
Edit: Просто для полноты пользы, вот версия одной строки:
var roleNames = Roles.Where(r => UserRoles
.Where(ur => ur.user_id == 1)
.Select(ur => ur.role_id)
.Contains(r.role_id))
.Select(r => r.roleName);
В скорлупе ореха, вместо того, чтобы это быть «B в множестве А», это больше похоже на «Set А содержит B ».