Question: Does lazy loading load the entire collection even if you only iterate over the first item in the collection? Or does it only load the items that are iterated over within the collection?

...or do I have no idea what I'm talking about?

Answer: 
@Slauma's answer is correct--the entire collection is loaded when the navigation property is accessed for the first time. It has to be this way with "normal" navigation properties because the collection is just a regular ICollection<> and not an IQueryable<>.

However, there are two things you can do if you don't want the entire collection loaded. If you have a context available, then you can use the Query method to really load lazily. For example:

```
foreach (var role in context.Entry(user).Collection(e => e.Roles).Query())
{    
    Console.WriteLine(role.Name);    
    if (role.Name == "Role1")    
        break;    
}    

```

You can take this a bit further if you know in advance which entity you are looking for. For example, to load just Role1 you could do:

```
var role1 = context.Entry(user)
                .Collection(e => e.Roles)
                .Query()
                .Single(r => r.Name == "Role1");

```

This post provides some more detail on the Query method:

<http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities.aspx>

If you want to make this more transaprent such that you don't need the context to be available when running the query, then check out these blog posts that explain how to make extra-lazy collections:

<http://blog.oneunicorn.com/2011/03/28/extra-lazy-collection-count-with-ef-4-1-part-1/>

and more general IQueryable-backed collections:

<http://blog.oneunicorn.com/2011/03/30/a-more-general-queryable-collection/>
It iterates over the projection once every time it iterates over the source enumerable.