[c#] Lazy Loading vs Eager Loading

Lazy loading in Entity Framework is the default phenomenon that happens for loading and accessing the related entities. However, eager loading is referred to the practice of force-loading all these relations. I have come across the question of under what situation eager loading could be more beneficial than lazy loading. Asking this, because it is obvious that lazy loading is more resource friendly, and even if we use the ToList() method, we can still take advantage of the lazy loading behavior. However, I thought maybe lazy loading increases the number of requests to the actual database and maybe that's why sometimes developers use the Inlcude method to force-loading all relations. For example, when using the Visual Studio auto-scaffolding in MVC 5, the Index method that is automatically created in the controller always uses Eager Loading, and I've always had the question of why Microsoft uses Eager Loading by default in that case.

I would appreciate if someone explains to me under what situation eager loading would be more beneficial than lazy loading, and why do we use it at all while there's something more resource friendly as Lazy Loading.

This question is related to c# entity-framework entity-framework-6

The answer is

I think it is good to categorize relations like this

When to use eager loading

  1. In "one side" of one-to-many relations that you sure are used every where with main entity. like User property of an Article. Category property of a Product.
  2. Generally When relations are not too much and eager loading will be good practice to reduce further queries on server.

When to use lazy loading

  1. Almost on every "collection side" of one-to-many relations. like Articles of User or Products of a Category
  2. You exactly know that you will not need a property instantly.

Note: like Transcendent said there may be disposal problem with lazy loading.

Similar questions with c# tag:

Similar questions with entity-framework tag:

Similar questions with entity-framework-6 tag: