Entity Framework Core: āļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļĨāļ°āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļāđāļāļāļĩ 2026
āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ Entity Framework Core 10 āļāļ .NET 10 āđāļĢāļĩāļĒāļāļĢāļđāđ AsNoTracking, compiled queries, batch updates, split queries āđāļĨāļ°āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ LeftJoin

Entity Framework Core 10 āļāļķāđāļāđāļāļīāļāļāļąāļ§āļāļĢāđāļāļĄāļāļąāļ .NET 10 LTS āđāļāđāļāļ·āļāļāļāļĪāļĻāļāļīāļāļēāļĒāļ 2025 āļāļģāđāļŠāļāļāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ LeftJoin āļāļēāļĢāļāđāļāļŦāļēāđāļ§āļāđāļāļāļĢāđ named query filters āđāļĨāļ°āļāļēāļĢāļāļĢāļąāļāļāļĢāļļāļāļāļēāļĢāđāļāļĨ SQL āļāļĒāđāļēāļāļĄāļĩāļāļąāļĒāļŠāļģāļāļąāļ āļāļāļāļ§āļēāļĄāļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄāđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļāļāļāļ EF Core āļāļĩāđāļŠāđāļāļāļĨāđāļāļĒāļāļĢāļāļāđāļāļāļ§āļēāļĄāđāļĢāđāļ§āđāļāļāļēāļĢ query āļāļēāļĢāļāļąāļāļŠāļĢāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āđāļĨāļ°āļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāļāļĢāļąāļāļāļāļēāļāđāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄ production
EF Core 10 āđāļāđāļāđāļ§āļāļĢāđāļāļąāļ Long-Term Support āļāļĩāđāđāļāđāļĢāļąāļāļāļēāļĢāļŠāļāļąāļāļŠāļāļļāļāļāļāļāļķāļāđāļāļ·āļāļāļāļĪāļĻāļāļīāļāļēāļĒāļ 2028 āļāđāļāļāđāļāđ SDK āđāļĨāļ° runtime āļāļāļ .NET 10 āđāļāļāļāļĨāļīāđāļāļāļąāļāļāļĩāđāļĒāļąāļāļāļāđāļāđ .NET 8 āļāļ§āļĢāđāļĨāļ·āļāļāđāļāđ EF Core 8 (LTS) āļāļāļāļ§āđāļēāļāļ°āļāļģāđāļāļīāļāļāļēāļĢāļĒāđāļēāļĒāļĢāļ°āļāļāđāļŠāļĢāđāļāļŠāļīāđāļ
Query Tracking: āđāļĄāļ·āđāļāđāļāļāļ§āļĢāļāļīāļāļāļēāļĢāđāļāđāļāļēāļāđāļĨāļ°āđāļāļĢāļēāļ°āđāļŦāļāļļāđāļ
āļāļļāļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđ DbSet<T> āļāļ°āđāļāļ entity āļāļĩāđāļŠāđāļāļāļĨāļąāļāđāļāđāļēāļāļąāļ change tracker āđāļāļĒāļāđāļēāđāļĢāļīāđāļĄāļāđāļ Tracker āļāļĩāđāļāļ°āđāļāđāļ snapshot āļāļāļāļāđāļē property āđāļāļīāļĄ āļāļģāļāļ§āļāļāļ§āļēāļĄāđāļāļāļāđāļēāļāđāļĄāļ·āđāļāđāļĢāļĩāļĒāļ SaveChanges āđāļĨāļ°āđāļāđāđāļāļāđāļāļāļąāļāđāļĒāđāļāļāļāļ identity āļāđāļēāļĄ navigation āļāđāļēāļāđ āļāđāļēāđāļāđāļāđāļēāļĒāļāļĩāđāđāļĄāđāļāļģāđāļāđāļāđāļĄāļ·āđāļāļāđāļāļĄāļđāļĨāļāļđāļāļŠāđāļāļāļĢāļāđāļāļĒāļąāļ API response āļŦāļĢāļ·āļ view model āđāļāļāļāđāļēāļāļāļĒāđāļēāļāđāļāļĩāļĒāļ§
public async Task<List<ProductDto>> GetActiveByCategoryAsync(
int categoryId, CancellationToken ct)
{
return await _context.Products
.AsNoTracking() // āļāđāļēāļĄ change tracker āļāļąāđāļāļŦāļĄāļ
.Where(p => p.CategoryId == categoryId && p.IsActive)
.OrderBy(p => p.Name)
.Select(p => new ProductDto // āļāļēāļĒāļāđāļāļĄāļđāļĨāđāļāđāļ DTO āļāļĩāđāļĢāļ°āļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ
{
Id = p.Id,
Name = p.Name,
Price = p.Price
})
.ToListAsync(ct);
}AsNoTracking āļāļāļąāļāļāđāļēāđāļāđāļāđāļēāļĒāđāļāļāļēāļĢāļŠāļĢāđāļēāļ snapshot āđāļĨāļ°āļāļēāļĢāđāļāđāđāļ identity āļāļāļāđāļāđāļĨāļ° entity āđāļĄāļ·āđāļāđāļāđāļĢāđāļ§āļĄāļāļąāļ Select āļāļ°āļĄāļĩāđāļāļĩāļĒāļāļāļāļĨāļąāļĄāļāđāļāļĩāđāļāļģāđāļāđāļāđāļāđāļēāļāļąāđāļāļāļĩāđāļāļđāļāļŠāđāļāļāđāļēāļāđāļāļĢāļ·āļāļāđāļēāļĒ āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļēāļāļāļĩāđāļĄāļĩ 50,000 āđāļāļ§ āļĢāļđāļāđāļāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļĨāļāļāļēāļĢāļāļąāļāļŠāļĢāļĢāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāđ 40-60% āđāļĄāļ·āđāļāđāļāļĩāļĒāļāļāļąāļāļāļēāļĢ query full-entity āđāļāļāļĄāļĩ tracking
āļŠāļģāļŦāļĢāļąāļ context āļāļĩāđāđāļĄāđāđāļāļĒāđāļāđāđāļāļāđāļāļĄāļđāļĨ āđāļŦāđāļāļąāđāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāļāļāļĨāļāļāļ°āđāļāļĩāļĒāļ:
builder.Services.AddDbContext<CatalogContext>(options =>
options.UseSqlServer(connectionString)
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));Split Queries āđāļāļ·āđāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļēāļĢāļĢāļ°āđāļāļīāļāđāļāļ Cartesian
āļāļēāļĢāđāļŦāļĨāļ entity āļāļĩāđāļĄāļĩ collection navigation āļŦāļĨāļēāļĒāļāļąāļ§āļāđāļēāļ Include āļāļ°āļŠāļĢāđāļēāļāļāļģāļŠāļąāđāļ SQL āđāļāļĩāļĒāļ§āļāļĩāđāļĄāļĩ JOIN āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāđāļŦāļĨāļāļŠāļāļāļāļāļĨāđāļĨāļāļāļąāļāļāļķāđāļāđāļāļāļĢāđāļāļĄāļāļąāļ āļāļĨāļĨāļąāļāļāđāļāļ°āļāļĒāļēāļĒāļāļąāļ§āđāļāđāļāļāļĨāļāļđāļ Cartesian āļāļāļāļāļāļĨāđāļĨāļāļāļąāļāļāđāļēāļāđ āļāļģāđāļŦāđāļāđāļāļĄāļđāļĨāđāļāļ§āļŦāļĨāļąāļāļāļđāļāļāļģāļāđāļģāđāļāļāļļāļāļāļēāļĢāļĢāļ§āļĄāļāļąāļ
public async Task<Order?> GetWithDetailsAsync(int orderId, CancellationToken ct)
{
return await _context.Orders
.AsSplitQuery() // SQL āļŦāļāļķāđāļāļāļģāļŠāļąāđāļāļāđāļāļŦāļāļķāđāļ Include
.Include(o => o.Items)
.ThenInclude(i => i.Product)
.Include(o => o.Payments)
.Include(o => o.ShippingEvents)
.FirstOrDefaultAsync(o => o.Id == orderId, ct);
}AsSplitQuery āđāļāđāļāļāļēāļĢāđāļŦāļĨāļāđāļāđāļāļāļģāļŠāļąāđāļ SQL āđāļĒāļāļāļąāļāļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ° navigation āļāđāļāđāļĨāļāđāļāļĨāļĩāđāļĒāļāļāļ·āļ: āļŦāļĨāļēāļĒ round-trip āđāļāļāļāļĩāđāļāļ°āđāļāđāļāļŦāļāļķāđāļ āđāļāđāđāļāđāļĨāļ°āļāļļāļāļāļĨāļĨāļąāļāļāđāļāļ°āļĄāļĩāļāļāļēāļāđāļĨāđāļāđāļĨāļ°āļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļąāļāļŦāļēāļāļēāļĢāļāļģāļāđāļģāđāļāļ§ EF Core 10 āļĒāļąāļāđāļāđāđāļāļāļ§āļēāļĄāđāļĄāđāļŠāļāļāļāļĨāđāļāļāļāļāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĨāļģāļāļąāļāļāļĩāđāļĄāļĩāļĄāļēāļāļēāļāđāļ split queries āļāļģāđāļŦāđāļāļēāļĢāđāļĢāļĩāļĒāļāļĨāļģāļāļąāļ subquery āļāļĢāļāļāļąāļ query āļŦāļĨāļąāļ
Single query āļĒāļąāļāļāļāđāļŦāļĄāļēāļ°āļŠāļĄāļāļ§āđāļēāđāļĄāļ·āđāļāđāļŦāļĨāļ collection navigation āđāļāļĩāļĒāļāļŦāļāļķāđāļāļāļąāļ§ āļŦāļĢāļ·āļāđāļĄāļ·āđāļ latency āļāļāļ round-trip āļŠāļđāļ (āļāļēāļĢāđāļĢāļĩāļĒāļāļāļēāļāļāđāļāļĄāļđāļĨāļāđāļēāļĄāļ āļđāļĄāļīāļ āļēāļ) āļāļ§āļĢāļāļģ benchmark āļāļąāđāļāļŠāļāļāđāļŦāļĄāļāļŠāļģāļŦāļĢāļąāļāļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļēāļāļķāļāđāļāļāļēāļ°āļāđāļāļāļāļąāļāļŠāļīāļāđāļ
āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāđāļāļ Batch āļāđāļ§āļĒ ExecuteUpdate āđāļĨāļ° ExecuteDelete
āđāļ§āļīāļĢāđāļāđāļāļĨāļ§āđ EF āđāļāļāļāļąāđāļāđāļāļīāļĄāļāļ°āđāļŦāļĨāļ entity āđāļāđāđāļ property āđāļĨāđāļ§āđāļĢāļĩāļĒāļ SaveChanges āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļģāļāļ§āļāļĄāļēāļāļāļĩāđāļŠāđāļāļāļĨāļāļĢāļ°āļāļāļāđāļāļŦāļĨāļēāļĒāļāļąāļāđāļāļ§ āļ§āļīāļāļĩāļāļĩāđāļŠāļĢāđāļēāļ instance āļāļĩāđāļāļđāļāļāļīāļāļāļēāļĄāļŦāļĨāļēāļĒāļāļąāļāļāļąāļ§āđāļĨāļ°āļāļģāļŠāļąāđāļ UPDATE āđāļĒāļāļāļąāļ EF Core 7 āđāļāļīāļāļāļąāļ§ ExecuteUpdateAsync āđāļĨāļ° ExecuteDeleteAsync āđāļāļ·āđāļāļŠāđāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāđāļāđāļāļāļģāļŠāļąāđāļ SQL āđāļāļĩāļĒāļ§ EF Core 10 āļāļģāđāļŦāđ API āļāđāļēāļĒāļāļķāđāļāļāļĩāļāđāļāļĒāļĢāļąāļ lambda āļāļĢāļĢāļĄāļāļēāđāļāļ expression tree
public async Task ApplySeasonalDiscountAsync(
int categoryId, decimal discountPercent, CancellationToken ct)
{
var affected = await _context.Products
.Where(p => p.CategoryId == categoryId && p.IsActive)
.ExecuteUpdateAsync(s =>
{
s.SetProperty(p => p.Price, p => p.Price * (1 - discountPercent / 100));
s.SetProperty(p => p.LastModified, DateTime.UtcNow);
}, ct);
// affected = āļāļģāļāļ§āļāđāļāļ§āļāļĩāđāļāļđāļāļāļąāļāđāļāļ
}āļāļģāļŠāļąāđāļāļāļĩāđāļāļđāļāđāļāļĨāđāļāđāļ UPDATE ... SET ... WHERE āđāļāļĩāļĒāļ§ āđāļĄāđāļĄāļĩ entity āđāļāļāļđāļāđāļŦāļĨāļāđāļāđāļēāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāđāļāļ 10,000 āđāļāļ§ āđāļ§āļĨāļēāđāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļĨāļāļĨāļāļāļēāļāļŦāļĨāļēāļĒāļ§āļīāļāļēāļāļĩ (āđāļāļ tracked) āđāļŦāļĨāļ·āļāđāļāļĩāļĒāļāļĄāļīāļĨāļĨāļīāļ§āļīāļāļēāļāļĩ
āļĢāļđāļāđāļāļāđāļāļĩāļĒāļ§āļāļąāļāđāļāđāđāļāđāļāļąāļāļāļēāļĢāļĨāļ:
public async Task PurgeExpiredSessionsAsync(CancellationToken ct)
{
await _context.Sessions
.Where(s => s.ExpiresAt < DateTime.UtcNow)
.ExecuteDeleteAsync(ct);
}āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ .NET āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ LeftJoin āđāļ EF Core 10
āļāđāļāļ EF Core 10 āļāļēāļĢāļāļģ LEFT JOIN āļāđāļāļāđāļāđāļāļēāļĢāļĢāļ§āļĄ GroupJoin, SelectMany āđāļĨāļ° DefaultIfEmpty āđāļāļĢāļđāļāđāļāļāđāļāļāļēāļ°āļāļĩāđāļāļąāļāļāļąāļāļāļēāļŠāđāļ§āļāđāļŦāļāđāļāđāļāļāļāđāļāļŦāļēāļāļļāļāļāļĢāļąāđāļāļāļĩāđāđāļāđāļāļēāļ EF Core 10 āđāļāļīāđāļĄ LeftJoin āđāļāđāļāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ LINQ āļĢāļ°āļāļąāļāļŦāļāļķāđāļ
public async Task<List<EmployeeReportDto>> GetEmployeeDepartmentReportAsync(
CancellationToken ct)
{
return await _context.Employees
.LeftJoin(
_context.Departments,
employee => employee.DepartmentId,
department => department.Id,
(employee, department) => new EmployeeReportDto
{
FullName = employee.FirstName + " " + employee.LastName,
Department = department.Name ?? "Unassigned",
HiredAt = employee.HiredAt
})
.OrderBy(r => r.FullName)
.ToListAsync(ct);
}SQL āļāļĩāđāļŠāļĢāđāļēāļāļāļķāđāļāđāļāđ clause LEFT JOIN āļĄāļēāļāļĢāļāļēāļ āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ RightJoin āļāđāļĄāļĩāđāļŦāđāđāļāđāļāļēāļāđāļāđāļāļāļąāļ āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļāļąāđāļāļŠāļāļāļāļāļąāļāļŦāđāļ§āļāđāļāđāļŠāļēāļĄāđāļĄāļāļāļāļāļĩāđāļĒāļēāļ§āđāļŦāļĒāļĩāļĒāļāļāļķāđāļāļāļģāđāļāđāļāļāđāļāļāđāļāđāļāđāļāļāļŦāļāđāļēāļāļĩāđ
Named Query Filters āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļāļāļŦāļĨāļēāļĒāļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ
Global query filters āļāļđāļāļāļģāļāļąāļāđāļŦāđāļĄāļĩāđāļāļĩāļĒāļāļŦāļāļķāđāļ filter āļāđāļāļŦāļāļķāđāļāļāļĢāļ°āđāļ āļ entity āļāļąāđāļāđāļāđ EF Core 2.0 āđāļāļāļāļĨāļīāđāļāļāļąāļāļāļĩāđāđāļāđāļāļąāđāļ soft-delete āđāļĨāļ° multi-tenancy āļāđāļāļāļĢāļ§āļĄāđāļāļ·āđāļāļāđāļāđāļāđāļāļāļīāļāļāļāđāđāļāļĩāļĒāļ§āđāļĨāļ°āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļēāļĢāđāļāđāļāļēāļāđāļāļāđāļĨāļ·āļāļāđāļāđ EF Core 10 āđāļāļīāļāļāļąāļ§ named query filters
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Invoice>()
.HasQueryFilter("SoftDelete", i => !i.IsDeleted)
.HasQueryFilter("Tenant", i => i.TenantId == _tenantId);
}Endpoint āļŠāļģāļŦāļĢāļąāļāļāļđāđāļāļđāđāļĨāļĢāļ°āļāļāļŠāļēāļĄāļēāļĢāļāļāļīāļ filter soft-delete āđāļāļāļāļ°āļāļĩāđāļĒāļąāļāļāļāļĢāļąāļāļĐāļēāļāļēāļĢāđāļĒāļ tenant āđāļ§āđ:
public async Task<List<Invoice>> GetAllIncludingDeletedAsync(CancellationToken ct)
{
return await _context.Invoices
.IgnoreQueryFilters(["SoftDelete"]) // filter tenant āļĒāļąāļāļāļāļāļģāļāļēāļ
.ToListAsync(ct);
}āļŠāļīāđāļāļāļĩāđāļāļāļąāļāļāļ§āļēāļĄāļāļģāđāļāđāļāđāļāļāļēāļĢāļŠāļĢāđāļēāļ extension method āļāļāļ IQueryable āđāļāļāļāļģāļŦāļāļāđāļāļāļāļĩāđāđāļāļīāđāļĄāđāļāļ·āđāļāļāđāļ filter āļāđāļ§āļĒāļāļāđāļāļ
āļāļ§āļēāļĄāļĒāļ·āļāļŦāļĒāļļāđāļāļāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāđāļĨāļ°āļāļēāļĢāļāļģāļŦāļāļāļāđāļē Pooling
āļāđāļāļāļīāļāļāļĨāļēāļāļāļēāļāļāđāļāļĄāļđāļĨāļāļąāđāļ§āļāļĢāļēāļ§ (āđāļāļĢāļ·āļāļāđāļēāļĒāļāļąāļāļāđāļāļ, Azure SQL failover, connection pool āļŦāļĄāļ) āļāļģāđāļŦāđāđāļāļīāļ exception āļāļĩāđāļĄāļąāļāļāļģāđāļŦāđ pipeline āļāļāļ request āļĨāđāļĄāđāļŦāļĨāļ§ EF Core āļĄāļĩ logic retry āđāļāļāļąāļ§ āđāļāđāļāđāļēāđāļĢāļīāđāļĄāļāđāļāļāđāļāļāļĄāļĩāļāļēāļĢāļāļģāļŦāļāļāļāđāļēāļāļĒāđāļēāļāļāļąāļāđāļāļ
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(connectionString, sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount: 5,
maxRetryDelay: TimeSpan.FromSeconds(10),
errorNumbersToAdd: null); // retry āļŠāļģāļŦāļĢāļąāļāļāđāļāļāļīāļāļāļĨāļēāļāļāļąāđāļ§āļāļĢāļēāļ§āļāļąāđāļāļŦāļĄāļ
sqlOptions.CommandTimeout(30); // timeout āļāļģāļŠāļąāđāļ 30 āļ§āļīāļāļēāļāļĩ
}));āļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđ pooling āđāļ connection string āļāđāļĄāļĩāļāļ§āļēāļĄāļŠāļģāļāļąāļāđāļāđāļāļāļąāļ:
Server=db.example.com;Database=AppDb;Min Pool Size=5;Max Pool Size=100;Connection Timeout=15;Min Pool Size āđāļāđāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļĩāđāļāļĢāđāļāļĄāđāļāđāļāļēāļāļŠāļģāļŦāļĢāļąāļāļāļĢāļēāļāļāļīāļāļāļĩāđāļāļļāđāļāļŠāļđāļ Max Pool Size āļāļģāļāļąāļāļāļģāļāļ§āļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļĩāđāđāļāļīāļāļāļąāđāļāļŦāļĄāļāđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨāļāļģāļāļēāļāļŦāļāļąāļāđāļāļīāļāđāļ āļāđāļēāđāļĢāļīāđāļĄāļāđāļ 100 āđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļāđāļ§āđāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļŠāđāļ§āļāđāļŦāļāđ āđāļāđāļāļĢāļīāļāļēāļĢāļāļĩāđāļĄāļĩ throughput āļŠāļđāļāļāļēāļāļāđāļāļāļāļĢāļąāļāđāļāđāļāļāļēāļĄāļāļĢāļīāļĄāļēāļ query āļāļĢāđāļāļĄāļāļąāļāļāļĢāļīāļ
Retry āļāļąāļāđāļāļĄāļąāļāļīāđāļĄāđāļāļģāļāļēāļāļ āļēāļĒāđāļ transaction āļāļĩāđāļāļđāđāđāļāđāđāļĢāļīāđāļĄāļāđāļ āđāļŦāđāļŦāđāļ transaction āļāļąāđāļāļŦāļĄāļāđāļāļāļĨāļĒāļļāļāļāđ retry āđāļāļ manual āđāļāļĒāđāļāđ context.Database.CreateExecutionStrategy().ExecuteAsync(...) āđāļāļ·āđāļāļāļąāļāļāļēāļĢāļāđāļāļāļīāļāļāļĨāļēāļāļāļąāđāļ§āļāļĢāļēāļ§āđāļāļŦāļĨāļēāļĒāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢ
āļāļĨāļĒāļļāļāļāđāļāļēāļĢāļāļģ Indexing āđāļĨāļ°āļāļēāļĢāļ§āļīāđāļāļĢāļēāļ°āļŦāđ Query
Migration āļāļāļ EF Core āļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļ index āđāļāļāļāļĢāļ°āļāļēāļĻāđāļāđ āđāļāđāļāļēāļĢāđāļĨāļ·āļāļāļāļāļĨāļąāļĄāļāđāļāļĩāđāļāļ°āļāļģ index āļāđāļāļāļāļēāļĻāļąāļĒāļāļ§āļēāļĄāđāļāđāļēāđāļāļĢāļđāļāđāļāļ query
modelBuilder.Entity<Order>(entity =>
{
// index āđāļāļāļāļŠāļĄāļŠāļģāļŦāļĢāļąāļāļĢāļđāļāđāļāļ query āļāļĩāđāđāļāđāļāđāļāļĒ
entity.HasIndex(o => new { o.CustomerId, o.Status, o.CreatedAt })
.HasDatabaseName("IX_Order_Customer_Status_Date");
// index āđāļāļāļĄāļĩāļāļąāļ§āļāļĢāļāļāļŠāļģāļŦāļĢāļąāļāļāļģāļŠāļąāđāļāļāļ·āđāļāļāļĩāđāļĒāļąāļāļāļģāđāļāļīāļāļāļĒāļđāđāđāļāđāļēāļāļąāđāļ
entity.HasIndex(o => o.Status)
.HasFilter("[Status] <> 'Cancelled'")
.HasDatabaseName("IX_Order_ActiveStatus");
});Index āđāļāļāļĄāļĩāļāļąāļ§āļāļĢāļāļāļāđāļ§āļĒāļĨāļāļāļāļēāļ index āđāļāļĒāđāļĄāđāļĢāļ§āļĄāđāļāļ§āļāļĩāđ query āđāļĄāđāđāļāļĒāđāļāđāļēāļāļķāļ āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļēāļāļāļĩāđāļĄāļĩāļāļģāļŠāļąāđāļāļāļ·āđāļāļāļĩāđāļāļđāļāļĒāļāđāļĨāļīāļ 80% index āđāļāļāļĄāļĩāļāļąāļ§āļāļĢāļāļāļāļāļŠāļāļēāļāļ°āļāļĩāđāļĒāļąāļāļāļģāđāļāļīāļāļāļĒāļđāđāļŠāļēāļĄāļēāļĢāļāđāļĨāđāļāļāļ§āđāļēāļāļķāļ 5 āđāļāđāļēāđāļĨāļ°āļŠāđāļāļāđāļāđāđāļĢāđāļ§āļāļ§āđāļē
āđāļāļ·āđāļāļ§āļīāđāļāļĢāļēāļ°āļŦāđ SQL āļāļĩāđāļŠāļĢāđāļēāļāļāļķāđāļ āđāļŦāđāđāļāļīāļ logging āđāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄ development:
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(connectionString)
.LogTo(Console.WriteLine, LogLevel.Information)
.EnableSensitiveDataLogging());āļāļąāļāļĨāļāļ SQL āļāļĩāđāļāļąāļāļāļķāļāđāļ§āđāđāļāļĒāļąāļ SQL Server Management Studio āđāļĨāļ°āļĢāļąāļāļāđāļ§āļĒ SET STATISTICS IO ON āđāļāļ·āđāļāļāļĢāļ§āļāļŠāļāļ logical reads āļŦāļĢāļ·āļāđāļāđ EXPLAIN ANALYZE āļāļ PostgreSQL āļāļģāđāļāļ°āļāļģ index āļāļĩāđāļāļēāļāļŦāļēāļĒāđāļāļāļēāļ query plan āļĄāļąāļāđāļāļĒāđāļŦāđāđāļŦāđāļāđāļāļāļēāļŠāđāļāļāļēāļĢāđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļĩāđāļĄāļĩāļāļĨāļāļĢāļ°āļāļāļŠāļđāļāļŠāļļāļ
Compiled Queries āļŠāļģāļŦāļĢāļąāļ Hot Paths
Expression tree āļāļāļ LINQ āļāļ°āļāļđāļāđāļĒāļāļ§āļīāđāļāļĢāļēāļ°āļŦāđāđāļĨāļ°āđāļāļĨāđāļāđāļ SQL āļāļļāļāļāļĢāļąāđāļāļāļĩāđāļāļģāđāļāļīāļāļāļēāļĢ āļŠāļģāļŦāļĢāļąāļ query āļāļĩāđāļāļģāļāļēāļāļŦāļĨāļēāļĒāļāļąāļāļāļĢāļąāđāļāļāđāļāļāļēāļāļĩ (āđāļāđāļ āļāļēāļĢāļāđāļāļŦāļēāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļąāļ§āļāļ āļāļēāļĢāļāļĢāļ§āļāļŠāļāļ session) āļāđāļēāđāļāđāļāđāļēāļĒāđāļāļāļēāļĢāđāļāļĨāļāļĩāđāļāļ°āļŠāļ°āļŠāļĄ Compiled queries āļāļ°āđāļāļāļāļēāļĢāđāļāļĨāđāļ§āđāļāļąāđāļāđāļāđāđāļĢāļīāđāļĄāļāđāļāđāļāļāļāļĨāļīāđāļāļāļąāļ
public static class UserQueries
{
// āļāļāļĄāđāļāļĨāđāļāļĢāļąāđāļāđāļāļĩāļĒāļ§ āđāļāđāļāđāļģāļāļļāļāļāļēāļĢāđāļĢāļĩāļĒāļ
public static readonly Func<AppDbContext, string, CancellationToken, Task<UserSession?>>
GetActiveSession = EF.CompileAsyncQuery(
(AppDbContext ctx, string token, CancellationToken ct) =>
ctx.UserSessions
.AsNoTracking()
.FirstOrDefault(s => s.Token == token && s.ExpiresAt > DateTime.UtcNow));
}
// āļāļēāļĢāđāļāđāļāļēāļāđāļ middleware
var session = await UserQueries.GetActiveSession(dbContext, bearerToken, ct);Compiled queries āļāđāļēāļĄāļāļąāđāļāļāļāļāļāļēāļĢāđāļĒāļāļ§āļīāđāļāļĢāļēāļ°āļŦāđ expression tree āļāļąāđāļāļŦāļĄāļ āļāļ§āļēāļĄāđāļāļāļāđāļēāļāļāļāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļ°āļ§āļąāļāđāļāđāđāļāļāļēāļ°āļāļāđāļŠāđāļāļāļēāļāļāļ§āļēāļĄāļāļĩāđāļŠāļđāļ (āļĄāļēāļāļāļ§āđāļē 1,000 āļāļēāļĢāđāļĢāļĩāļĒāļ/āļāļēāļāļĩ) āļŠāļģāļŦāļĢāļąāļ endpoint CRUD āļĄāļēāļāļĢāļāļēāļ āđāļāļ query āđāļāļāļąāļ§āļāļāļ EF Core āļāļąāļāļāļēāļĢāļāļēāļĢāđāļāđāļāđāļģāļāļēāļĢāđāļāļĨāļāļĒāļđāđāđāļĨāđāļ§
āļāļēāļĢāđāļāļĨ Parameterized Collection āđāļ EF Core 10
Query āļāļĩāđāļāļĢāļāļāļāļēāļĄāļĢāļēāļĒāļāļēāļĢ ID āđāļāđāļāļŦāļāļķāđāļāđāļāļĢāļđāļāđāļāļāļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāđāļāļāļēāļĢāđāļāđāļēāļāļķāļāļāđāļāļĄāļđāļĨ EF Core 10 āđāļāļĨāļĩāđāļĒāļāļāļĨāļĒāļļāļāļāđāļāļēāļĢāđāļāļĨāđāļĢāļīāđāļĄāļāđāļāļŠāļģāļŦāļĢāļąāļ parameterized collections āđāļāļāļāļĩāđāļāļ°āđāļāđāļēāļĢāļŦāļąāļŠāļĢāļēāļĒāļāļēāļĢāđāļāđāļ JSON array (EF Core 8-9) āļŦāļĢāļ·āļāđāļāļĢāļāļāđāļēāļāļāļāļĩāđāđāļāļ inline (EF Core 7 āđāļĨāļ°āļāđāļāļāļŦāļāđāļē) EF Core 10 āđāļāļĨāđāļāđāļĨāļ°āļāđāļēāđāļāđāļāļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđ SQL āđāļĒāļāļāļąāļ
// āļāđāļāļāļŦāļāđāļē (EF Core 8-9): āļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđ JSON array
// @__ids_0='[1,2,3]'
// SELECT ... WHERE Id IN (SELECT value FROM OPENJSON(@__ids_0))
// EF Core 10: āļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđāđāļĒāļāļāļąāļāļāļĢāđāļāļĄ padding
// SELECT ... WHERE Id IN (@ids1, @ids2, @ids3)
var orderIds = new[] { 101, 205, 389 };
var orders = await _context.Orders
.Where(o => orderIds.Contains(o.Id))
.ToListAsync(ct);āļ§āļīāļāļĩāļāļēāļĢāđāļŦāļĄāđāļāļĩāđāđāļŦāđāļāđāļāļĄāļđāļĨ cardinality āđāļāđ query planner āļāļāļāļāļēāļāļāđāļāļĄāļđāļĨ āđāļāļāļāļ°āļāļĩāđāļĒāļąāļāļāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļēāļĢāļāļ§āļĄāļāļāļ plan cache āļāđāļēāļ parameter padding āļŠāļģāļŦāļĢāļąāļāļāļĢāļāļĩāļāļĩāđāļ§āļīāļāļĩ JSON āļāļģāļāļēāļāđāļāđāļāļĩāļāļ§āđāļē (āļāļāļĨāđāļĨāļāļāļąāļāļāļāļēāļāđāļŦāļāđāļĄāļēāļ) āđāļŦāđ override āļāļĪāļāļīāļāļĢāļĢāļĄāļāđāļ query:
var orders = await _context.Orders
.Where(o => EF.Parameter(orderIds).Contains(o.Id)) // āļāļąāļāļāļąāļāđāļŦāļĄāļ JSON
.ToListAsync(ct);āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļŠāļĢāļļāļ
- āđāļāđ
AsNoTracking()āđāļĨāļ°āļāļēāļĢāļāļēāļĒāļāđāļāļĄāļđāļĨāļāđāļ§āļĒSelectāđāļāļāļļāļ query āđāļāļāļāđāļēāļāļāļĒāđāļēāļāđāļāļĩāļĒāļ§āđāļāļ·āđāļāļāļāļąāļāļāđāļēāđāļāđāļāđāļēāļĒāļāļāļ change tracker - āđāļāđ
AsSplitQuery()āđāļĄāļ·āđāļāđāļŦāļĨāļ collection navigation āļŦāļĨāļēāļĒāļāļąāļ§āđāļāļ·āđāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļēāļĢāļĢāļ°āđāļāļīāļāđāļāļ Cartesian - āđāļāļāļāļĩāđāļĢāļđāļāđāļāļ tracked load-modify-save āļāđāļ§āļĒ
ExecuteUpdateAsyncāđāļĨāļ°ExecuteDeleteAsyncāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāļāļģāļāļ§āļāļĄāļēāļ - āļāļģāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ
LeftJoināļāļēāļ EF Core 10 āļĄāļēāđāļāđāđāļāļāļŦāđāļ§āļāđāļāđGroupJoin/SelectMany/DefaultIfEmptyāļāļĩāđāļĒāļēāļ§āđāļŦāļĒāļĩāļĒāļ - āļāļģāļŦāļāļāļāđāļē named query filters āđāļāļ·āđāļāļāļąāļāļāļēāļĢ soft-delete āđāļĨāļ° multi-tenancy āļāļĒāđāļēāļāļāļīāļŠāļĢāļ°
- āļāļąāđāļāļāđāļē
EnableRetryOnFailureāđāļĨāļ°āļāļĢāļąāļāļāļāļēāļ connection pool āļŠāļģāļŦāļĢāļąāļāļāļ§āļēāļĄāļĒāļ·āļāļŦāļĒāļļāđāļāđāļ production - āļāļģāļŦāļāļ index āđāļāļāļāļŠāļĄāđāļĨāļ°āđāļāļāļĄāļĩāļāļąāļ§āļāļĢāļāļāļāļēāļĄāļĢāļđāļāđāļāļ query āļāļĢāļīāļ āđāļĄāđāđāļāđāļāļēāļĢāļāļēāļāđāļāļē
- āļŠāļāļ§āļ compiled queries āļŠāļģāļŦāļĢāļąāļāđāļŠāđāļāļāļēāļāļāļĩāđāļĢāđāļāļāļāļĢāļīāļāđ āļāļĩāđāđāļāļīāļ 1,000 āļāļĢāļąāđāļāļāđāļāļāļēāļāļĩ
- āļāļĨāđāļāļĒāđāļŦāđ EF Core 10 āļāļąāļāļāļēāļĢāļāļēāļĢāđāļāļĨ parameterized collection āļāļēāļĄāļāđāļēāđāļĢāļīāđāļĄāļāđāļ āđāļĨāļ° override āđāļāļāļēāļ°āđāļĄāļ·āđāļ benchmark āļāļīāļŠāļđāļāļāđāļ§āđāļēāļāļģāđāļāđāļ
āļāđāļēāļāđāļāļīāđāļĄāđāļāļīāļĄ: āđāļĄāļāļđāļĨ EF Core Advanced āļāļĢāļāļāļāļĨāļļāļĄāļĢāļđāļāđāļāļāđāļŦāļĨāđāļēāļāļĩāđāđāļāļāļĢāļīāļāļāļāļāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ āđāļĨāļ° āļāļđāđāļĄāļ·āļ Clean Architecture āļāļąāļ .NET āļŠāļēāļāļīāļāļ§āļīāļāļĩāļāļēāļĢāļāļąāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļąāđāļ repository āđāļĨāļ° service āļāļĩāđāļŦāđāļāļŦāļļāđāļĄ query āđāļŦāļĨāđāļēāļāļĩāđ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ C# āđāļĨāļ° .NET: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ 2026
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ C# āđāļĨāļ° .NET āļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļ 17 āļāđāļ LINQ, async/await, dependency injection, Entity Framework āđāļĨāļ° best practice āļāļĢāđāļāļĄāļāļģāļāļāļāļĨāļ°āđāļāļĩāļĒāļāđāļĨāļ°āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

.NET 8: āļŠāļĢāđāļēāļ API āļāđāļ§āļĒ ASP.NET Core
āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļĢāđāļēāļ REST API āļĢāļ°āļāļąāļāļĄāļ·āļāļāļēāļāļĩāļāļāđāļ§āļĒ .NET 8 āđāļĨāļ° ASP.NET Core āļāļĢāļāļāļāļĨāļļāļĄ Controller, Entity Framework Core, āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāđāļāļĄāļđāļĨ āđāļĨāļ°āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļ

Rust: āļāļ·āđāļāļāļēāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļāļĩāđāļĄāļĩāļāļĢāļ°āļŠāļāļāļēāļĢāļāđāđāļāļāļĩ 2026
āđāļĢāļĩāļĒāļāļĢāļđāđ Rust āđāļāđāļāļĒāđāļēāļāļĢāļ§āļāđāļĢāđāļ§āđāļāļĒāļāļēāļĻāļąāļĒāļāļ§āļēāļĄāļĢāļđāđāļāđāļēāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļĄāļĩāļāļĒāļđāđ Ownership, borrowing, lifetimes āđāļĨāļ° pattern āļāļĩāđāļāļģāđāļāđāļāļāļāļīāļāļēāļĒāđāļ§āđāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļāļĩāđāļĄāļēāļāļēāļ C++, Java āļŦāļĢāļ·āļ Python