ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ вопросов ❓ Π½Π° собСсСдовании Π² C# 🍧

ΠžΠ±Π·ΠΎΡ€ вопросов ΠΏΠΎ языка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ C# ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

πŸ—„οΈ Как ΠΏΠΈΡΠ°Ρ‚ΡŒ эффСктивныС запросы ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· .NET?

Typing SVG

Static Badge

✨ ОглавлСниС

⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ


1️⃣ ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ

ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ:


2️⃣ ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ стратСгии для эффСктивных запросов

a) Π’Ρ‹Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ORM ΠΈΠ»ΠΈ уровня доступа

ΠšΠ°Π²Π΅Ρ€Π·Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: Π½Π° собСсСдовании ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° EF Core быстрСС ADO.NET ΠΈ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. ΠžΡ‚Π²Π΅Ρ‚: EF Core ΡƒΠ΄ΠΎΠ±Π΅Π½, Π½ΠΎ для массовых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ»ΠΈ слоТных Π°Π³Ρ€Π΅Π³Π°Ρ†ΠΈΠΉ ADO.NET/Dapper Π±ΡƒΠ΄Π΅Ρ‚ быстрСС.


b) Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ Π½Π° сСрвСрС, Π° Π½Π΅ Π² памяти

var data = context.Users.ToList().Where(u => u.IsActive);
var data = context.Users.Where(u => u.IsActive).ToList();

c) ИспользованиС ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΉ

var data = context.Users
                  .Where(u => u.IsActive)
                  .Select(u => new { u.Id, u.Name })
                  .ToList();

d) ΠžΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (Deferred Execution)

var query = context.Users.Where(u => u.IsActive); // Π΅Ρ‰Ρ‘ Π½Π΅ выполняСтся
var list = query.ToList(); // здСсь SQL выполняСтся

e) Avoid N+1 problem

// ΠŸΠ»ΠΎΡ…ΠΎ
var users = context.Users.ToList();
foreach(var user in users)
    var roles = context.Roles.Where(r => r.UserId == user.Id).ToList();

// Π₯ΠΎΡ€ΠΎΡˆΠΎ
var usersWithRoles = context.Users.Include(u => u.Roles).ToList();

f) ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ

var page = context.Users
                  .OrderBy(u => u.Id)
                  .Skip((pageNumber-1) * pageSize)
                  .Take(pageSize)
                  .ToList();

g) ИспользованиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… запросов

var user = context.Users
                  .FromSqlRaw("SELECT * FROM Users WHERE Name = {0}", userName)
                  .ToList();

h) ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ отслСТиваниС

var users = context.Users.AsNoTracking().Where(u => u.IsActive).ToList();

i) ΠŸΠ°ΠΊΠ΅Ρ‚Π½Π°Ρ вставка/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅

context.BulkInsert(users); // Ρ‡Π΅Ρ€Π΅Π· ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΡŽΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ

j) ИспользованиС индСксов ΠΈ оптимизация SQL

var sql = context.Users.Where(u => u.IsActive).ToQueryString();
Console.WriteLine(sql);

k) АсинхронныС запросы

var users = await context.Users.Where(u => u.IsActive).ToListAsync();

l) ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство соСдинСний


⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ

✨Dvurechensky✨