Reference · Fondasi C#

async/Task dan LINQ

Ringkasan satu halaman. Dari Lesson 0003.

Task vs Promise [1]

C#TypeScriptCatatan
async Task<Product> GetByIdAsync()async getById(): Promise<Product>Akhiran Async = konvensi TAP
async Task SaveAsync()Promise<void>Bukan async void
await Task.WhenAll(a, b)await Promise.all([a, b])Jangan di DbContext yang sama [3]
.Result, .Wait()tidak adaMemblokir thread. Jangan.

Dua larangan di ASP.NET Core [2]

Kapan query dieksekusi [4]

Deferred (membangun query)Eksekusi sekarang (SQL dikirim)
Where, Select, OrderBy, Skip, Take, Include foreach, ToList(Async), ToArray(Async), First, Single, Count, Any, Max

Tidak ada WhereAsync: hanya operator yang mengeksekusi query yang punya versi async. Enumerasi dua kali = query dua kali.

IEnumerable vs IQueryable [5]

IEnumerable<T>IQueryable<T>
Lambdadelegateexpression tree
Jalan dimemori .NETdatabase (diterjemahkan ke SQL)
Padanan Nodearray.filterprisma.findMany({ where })
// ❌ semua baris ditarik, filter di memori (AsEnumerable / variabel IEnumerable)
IEnumerable<Product> s = _db.Products; s.Where(p => p.Price > 100).ToList();
// ✅ filter, proyeksi, paging selagi IQueryable; ToListAsync terakhir
await _db.Products.Where(p => p.Price > 100).Select(...).ToListAsync();

Jawaban 60 detik

Where hanya membangun IQueryable (expression tree); itu deferred execution. SQL baru dikirim saat hasil dikonsumsi, di sini oleh ToListAsync, dan karena masih IQueryable filternya jadi WHERE di database. await tidak memblokir thread selama I/O; .Result memblokir dan bisa menyebabkan thread pool starvation. Jadi call stack async dari Controller sampai Repository, seperti async/await di Express.

Sumber: [1] Async return types · [2] ASP.NET Core Best Practices · [3] EF Core: Asynchronous Programming · [4] EF Core: How Queries Work · [5] IQueryable<T>