The method mapping and laziness
LINQ is the same shape as JS array methods with different names. Once you learn the dictionary you can read most of it on sight.
The trap is laziness. A JS .map().filter() runs immediately and gives you an array. A LINQ chain over IEnumerable<T> is a query description: nothing runs until you materialize it with ToList(), FirstOrDefault(), Any(), or a foreach. That deferral is what lets LINQ over a database translate the whole chain into SQL instead of running it in C#.
That's also where the most common performance slop comes from. If you materialize too early, you pull the whole table into memory and filter in C#. Fusion anti-pattern #7: push the filter into the query. Where before ToListAsync, so the database does the work with its indexes.
Try it yourself
Read a real query-store LINQ chain
Confirm the filter-then-materialize order in shipping code.
Tick every step to confirm you did it.
When does the query run
You write _db.Flights.Where(x => x.Active) and assign it to a variable. When does the database get hit?