C# | Вопросы собесов
5.1K subscribers
35 photos
1 file
983 links
Download Telegram
🤔 Что такое asp.net?

ASP.NET — это фреймворк для веб-разработки, предоставляемый Microsoft, который позволяет разработчикам строить динамичные веб-сайты, веб-приложения и веб-сервисы. Он основан на .NET Framework и поддерживает языки программирования, такие как C#, VB.NET и другие. ASP.NET отличается от простого HTML тем, что сервер выполняет код и отправляет результаты клиенту, позволяя создавать интерактивные и динамически обновляемые веб-страницы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥2
🤔 Что такое значимые типы?

Представляют собой типы данных, которые хранят свои значения непосредственно. В отличие от ссылочных типов (reference types), которые хранят ссылки на объекты в памяти, значимые типы хранят данные непосредственно в переменной.

🚩Характеристики

🟠Хранение в стеке
Значимые типы обычно хранятся в стеке, что делает их более эффективными по сравнению с ссылочными типами, которые хранятся в куче.
🟠Копирование значений
При присваивании одной переменной значимого типа другой переменной происходит копирование значения, а не ссылки.
🟠Отсутствие сборщика мусора
Значимые типы не требуют работы сборщика мусора для освобождения памяти, так как они автоматически удаляются при выходе из области видимости.

🚩Примеры

Примитивные типы
int number = 10;
float temperature = 36.6f;
bool isAlive = true;
char letter = 'A';


Структуры
public struct Point
{
public int X;
public int Y;

public Point(int x, int y)
{
X = x;
Y = y;
}
}

Point p1 = new Point(10, 20);
Point p2 = p1; // Копирование значения
p2.X = 30;

Console.WriteLine(p1.X); // Output: 10
Console.WriteLine(p2.X); // Output: 30


Перечисления
public enum DaysOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}

DaysOfWeek today = DaysOfWeek.Monday;


🚩Отличия от ссылочных типов

🟠Хранение в куче
Объекты ссылочных типов хранятся в куче, и на них ссылаются переменные.
🟠 Копирование ссылок
При присваивании одной переменной ссылочного типа другой переменной копируется ссылка на объект, а не сам объект.
🟠Сборка мусора
Сборщик мусора управляет памятью для объектов ссылочных типов, удаляя их, когда на них больше нет ссылок.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
🤔 Что такое индексы, какие типы бывают, использовал ли их на практике?

Индексы в контексте баз данных — это структуры, которые помогают ускорить операции выборки данных, предоставляя быстрые пути к данным в таблицах. Виды индексов включают кластерные, некластерные, полнотекстовые и другие. Кластерные индексы определяют физический порядок хранения данных в таблице, в то время как некластерные индексы хранят только указатели на данные. Я использовал индексы на практике для улучшения производительности запросов в базах данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥4
🤔 Где хранятся ссылочные типы?

Ссылочные типы хранятся в куче (heap), а переменные, которые их ссылаются, хранятся в стеке (stack).

🚩Моменты

🟠Куча (Heap)
Это область памяти, где выделяется память для объектов ссылочных типов. Куча управляется средой выполнения CLR (Common Language Runtime), и сборщик мусора (Garbage Collector) отвечает за освобождение памяти, когда объекты больше не используются.
🟠Стек (Stack)
Это область памяти, где хранятся значения переменных, которые ссылаются на объекты в куче, а также значения переменных значимых типов.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

void Example()
{
Person person1 = new Person { Name = "Alice", Age = 30 };
Person person2 = person1; // person2 ссылается на тот же объект, что и person1
person2.Age = 35;

Console.WriteLine(person1.Age); // Output: 35
Console.WriteLine(person2.Age); // Output: 35
}


🚩Что происходит в памяти

🟠Создание объекта `Person`
Когда выполняется new Person { Name = "Alice", Age = 30 }, новый объект Person создается в куче. В памяти выделяется место для хранения полей Name и Age. Переменная person1 хранится в стеке и содержит ссылку на объект Person в куче.
🟠Присваивание `person2 = person1`
Переменная person2 также хранится в стеке и получает копию ссылки, хранящейся в person1. Оба person1 и person2 теперь указывают на один и тот же объект в куче.
🟠Изменение `person2.Age`
Когда изменяется person2.Age, на самом деле изменяется поле Age объекта Person, на который ссылаются обе переменные.

🚩Сборка мусора (Garbage Collection)

Когда объект в куче больше не имеет активных ссылок из стека или других объектов, сборщик мусора может освободить память, занятую этим объектом. Это помогает управлять памятью и предотвращает утечки памяти.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
🤔 Что такое EF?

Entity Framework (EF) — это ORM (Object-Relational Mapping) фреймворк от Microsoft, который позволяет разработчикам работать с данными как с объектами, не беспокоясь о базовых SQL запросах. Это упрощает работу с базами данных, автоматически обрабатывая запросы, обновления и связи данных. EF поддерживает широкий спектр функциональности баз данных и облегчает интеграцию данных в .NET-приложения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
🤔 Как при ref & out выделяется память в кучи?

Ключевые слова ref и out используются для передачи аргументов по ссылке, что позволяет методам изменять значения переданных переменных. При этом сами ключевые слова не влияют на то, где выделяется память (в стеке или куче). Место выделения памяти определяется типом данных, который передается в метод.

🚩Основные концепции

🟠`ref`
Передает переменную по ссылке, позволяя методу как читать, так и изменять значение переменной.
void Increment(ref int number)
{
number++;
}

int value = 5;
Increment(ref value);
Console.WriteLine(value); // Output: 6


🟠`out`
Также передает переменную по ссылке, но требует, чтобы метод присвоил значение переменной перед тем, как метод завершится.
void Initialize(out int number)
{
number = 10;
}

int value;
Initialize(out value);
Console.WriteLine(value); // Output: 10


🚩Место выделения памяти

🟠Значимые типы (Value Types)
Переменные значимых типов, такие как int, float, struct, хранятся в стеке. Когда такие переменные передаются в метод с ref или out, передается ссылка на место в стеке, где хранится значение.
void ProcessValue(ref int value)
{
value = 42; // Изменение значения переменной в стеке
}

int x = 10;
ProcessValue(ref x); // Передача ссылки на переменную x в стеке


🟠Ссылочные типы (Reference Types)
Переменные ссылочных типов, такие как объекты классов, хранятся в куче, а ссылки на эти объекты — в стеке. При передаче ссылочных типов с ref или out, передается сама ссылка на объект в куче.
void UpdatePerson(ref Person person)
{
person.Name = "Updated Name"; // Изменение объекта в куче
}

Person person = new Person { Name = "Original Name" };
UpdatePerson(ref person); // Передача ссылки на объект person


Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 В чем разница между асинхронностью и многопоточностью?

Асинхронность и многопоточность — это два подхода к параллельной обработке задач. Асинхронность позволяет программе продолжать выполнение работы, в то время как она ждет завершения другой задачи (например, ввода/вывода), не блокируя основной поток. Многопоточность включает использование нескольких потоков для выполнения различных задач одновременно, что может ускорить выполнение программы за счет одновременной обработки данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥5
🤔 Что такое деревья выражений?

Представляют собой мощный инструмент для работы с кодом на уровне его синтаксического дерева. Они позволяют программно строить, анализировать и выполнять выражения, представленные в виде дерева объектов.

🚩Понятия

🟠Определение
Деревья выражений — это структура данных, которая представляет собой синтаксическое дерево выражения. Они позволяют рассматривать и манипулировать кодом как данными.
🟠Пространство имен
Деревья выражений находятся в пространстве имен System.Linq.Expressions.

🚩Зачем нужны?

🟠Динамическое создание кода
Позволяют создавать и компилировать код во время выполнения.
🟠Анализ выражений
Полезны для инструментов анализа кода, таких как ORM (например, Entity Framework), которые преобразуют выражения LINQ в SQL-запросы.
🟠Рефлексия
Помогают в сценариях, где нужно исследовать и манипулировать кодом на уровне метаданных.

Простое арифметическое выражение
using System;
using System.Linq.Expressions;

class Program
{
static void Main()
{
// Создаем параметры для выражения
ParameterExpression paramA = Expression.Parameter(typeof(int), "a");
ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

// Создаем выражение: a + b
BinaryExpression body = Expression.Add(paramA, paramB);

// Компилируем выражение в делегат
var add = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB).Compile();

// Используем делегат
int result = add(2, 3);
Console.WriteLine(result); // Output: 5
}
}


Выражение с логикой
using System;
using System.Linq.Expressions;

class Program
{
static void Main()
{
// Создаем параметры для выражения
ParameterExpression paramX = Expression.Parameter(typeof(int), "x");
ParameterExpression paramY = Expression.Parameter(typeof(int), "y");

// Создаем выражение: x > y ? x - y : y - x
Expression condition = Expression.Condition(
Expression.GreaterThan(paramX, paramY),
Expression.Subtract(paramX, paramY),
Expression.Subtract(paramY, paramX)
);

// Компилируем выражение в делегат
var compareAndSubtract = Expression.Lambda<Func<int, int, int>>(condition, paramX, paramY).Compile();

// Используем делегат
int result1 = compareAndSubtract(10, 5); // Output: 5
int result2 = compareAndSubtract(3, 8); // Output: 5

Console.WriteLine(result1);
Console.WriteLine(result2);
}
}


🚩Использование деревьев выражений

Одним из наиболее распространенных примеров использования деревьев выражений является LINQ. Когда вы пишете выражения LINQ, такие как Queryable.Where, они часто переводятся в деревья выражений, которые затем могут быть преобразованы в SQL-запросы или другие форматы.
using System;
using System.Linq;
using System.Linq.Expressions;

class Program
{
static void Main()
{
Expression<Func<int, bool>> expr = x => x > 5;

// Разбор дерева выражений
var body = (BinaryExpression)expr.Body;
var left = (ParameterExpression)body.Left;
var right = (ConstantExpression)body.Right;

Console.WriteLine($"Left: {left.Name}, Right: {right.Value}"); // Output: Left: x, Right: 5
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Как используется ключевое слово await?

В C#, ключевое слово `await` используется в сочетании с асинхронными методами для указания точки, в которой выполнение текущего метода будет приостановлено до завершения асинхронной операции. `await` делает код асинхронной операции выглядящим как синхронный и позволяет возвращать управление вызывающему коду, предотвращая блокировку UI или других операций, пока асинхронная операция выполняется.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
🤔 Для чего используются expression`ы?

Для представления кода в виде структур данных, что позволяет программно создавать, анализировать и выполнять этот код. Это дает мощные возможности для динамической работы с кодом, включая создание, трансформацию и выполнение выражений во время выполнения программы.

🚩Основные сценарии

🟠LINQ to SQL и другие ORM
Expression`ы широко используются в ORM (Object-Relational Mapping) системах, таких как Entity Framework и LINQ to SQL, для преобразования выражений LINQ в SQL-запросы.
using (var context = new MyDbContext())
{
var query = context.Users.Where(u => u.Age > 30);
// Выражение `u => u.Age > 30` представлено как Expression и переводится в SQL
foreach (var user in query)
{
Console.WriteLine(user.Name);
}
}


🟠Динамическое построение запросов
Expression`ы позволяют создавать динамические запросы, которые могут изменяться в зависимости от условий во время выполнения программы.
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> query, string propertyName, object value)
{
var parameter = Expression.Parameter(typeof(T), "x");
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Equal(member, constant);
var predicate = Expression.Lambda<Func<T, bool>>(body, parameter);

return query.Where(predicate);
}


🟠Построение компилируемых делегатов
Expression`ы можно использовать для создания делегатов, которые компилируются во время выполнения, что позволяет динамически генерировать и выполнять код.
Expression<Func<int, int, int>> expr = (a, b) => a + b;
var func = expr.Compile();
int result = func(2, 3); // result = 5


🟠Анализ и трансформация кода
Expression`ы позволяют анализировать и изменять выражения, что полезно для создания библиотек и фреймворков, которые работают с выражениями.
Expression<Func<int, bool>> expr = x => x > 5;
var body = (BinaryExpression)expr.Body;
var left = (ParameterExpression)body.Left;
var right = (ConstantExpression)body.Right;
Console.WriteLine($"Left: {left.Name}, Right: {right.Value}"); // Output: Left: x, Right: 5


🟠Валидация и динамическая генерация правил
Expression`ы могут быть использованы для создания динамических правил валидации и их проверки.
public static Func<T, bool> GetValidator<T>(string propertyName, object value)
{
var parameter = Expression.Parameter(typeof(T), "x");
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Equal(member, constant);
return Expression.Lambda<Func<T, bool>>(body, parameter).Compile();
}

var validateAge = GetValidator<User>("Age", 30);
bool isValid = validateAge(new User { Age = 30 }); // isValid = true


🟠Кэширование и оптимизация
Expression`ы могут быть использованы для создания кэша выражений, что позволяет оптимизировать выполнение часто повторяющихся операций.
var parameter = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(parameter, Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, parameter);
var compiled = lambda.Compile();

// Кэшируем делегат
var cache = new Dictionary<int, Func<int, int>>();
cache[2] = compiled;

int result = cache ; // result = 6


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🤔 Что такое сервис локатор?

Сервис локатор — это шаблон проектирования, который используется в программировании для управления зависимостями между классами. Он действует как централизованный реестр, который хранит экземпляры сервисов и предоставляет их по запросу. В C# этот шаблон помогает избежать жесткой связи между компонентами программы, облегчая тестирование и поддержку.
1. Централизованное управление: Сервис локатор держит реестр всех доступных сервисов и предоставляет их по запросу, что упрощает управление жизненным циклом объектов.
2. Гибкость: Шаблон позволяет легко заменять и обновлять сервисы без изменения кода, который их использует, что делает приложение более модульным.
3. Изоляция зависимостей: С помощью сервис локатора, компоненты могут запрашивать зависимости в рантайме, что снижает зависимость от конкретных реализаций.
Однако стоит учитывать, что чрезмерное использование сервис локатора может привести к скрытому управлению зависимостями, что усложняет отслеживание и управление ими в больших приложениях. Это может сделать архитектуру приложения менее прозрачной и затруднить отладку и тестирование.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍31
Forwarded from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это.

HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям.

Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%.

Если при просмотре вакансий ты видишь такой бейджик, это значит, что список навыков в твоем резюме качественно составлен.

Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием.

О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео
😁2👍1
🤔 Что такое expression?

Это структура данных, представляющая код в виде дерева. Деревья выражений позволяют программно строить, анализировать и выполнять код. Это мощный инструмент для динамического создания и трансформации выражений, что делает их полезными в различных сценариях, таких как LINQ, ORM (например, Entity Framework), динамическое построение запросов и создание компилируемых делегатов.

🚩Основные концепции

🟠Expression Tree (дерево выражений)
Это структура данных, которая представляет синтаксическое дерево кода. Каждая нода (узел) дерева является экземпляром класса Expression или его производных.
🟠System.Linq.Expressions
Пространство имен, в котором находятся классы и методы для работы с деревьями выражений.

🚩Пример создания

Простое арифметическое выражение
using System;
using System.Linq.Expressions;

class Program
{
static void Main()
{
// Создаем параметры для выражения
ParameterExpression paramA = Expression.Parameter(typeof(int), "a");
ParameterExpression paramB = Expression.Parameter(typeof(int), "b");

// Создаем выражение: a + b
BinaryExpression body = Expression.Add(paramA, paramB);

// Компилируем выражение в делегат
var add = Expression.Lambda<Func<int, int, int>>(body, paramA, paramB).Compile();

// Используем делегат
int result = add(2, 3);
Console.WriteLine(result); // Output: 5
}
}


🚩Сценарии использования expression

🟠LINQ to SQL и другие ORM
Деревья выражений широко используются в ORM системах для преобразования выражений LINQ в SQL-запросы. Это позволяет использовать LINQ-запросы для взаимодействия с базами данных.
using (var context = new MyDbContext())
{
var query = context.Users.Where(u => u.Age > 30);
// Выражение `u => u.Age > 30` представлено как Expression и переводится в SQL
foreach (var user in query)
{
Console.WriteLine(user.Name);
}
}


🟠Динамическое построение запросов
Деревья выражений позволяют создавать динамические запросы, которые могут изменяться в зависимости от условий во время выполнения программы.
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> query, string propertyName, object value)
{
var parameter = Expression.Parameter(typeof(T), "x");
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(value);
var body = Expression.Equal(member, constant);
var predicate = Expression.Lambda<Func<T, bool>>(body, parameter);

return query.Where(predicate);
}


🟠Построение компилируемых делегатов
Деревья выражений можно использовать для создания делегатов, которые компилируются во время выполнения, что позволяет динамически генерировать и выполнять код.
Expression<Func<int, int, int>> expr = (a, b) => a + b;
var func = expr.Compile();
int result = func(2, 3); // result = 5


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Что такое asp.net

ASP.NET — это веб-платформа от Microsoft для создания динамических сайтов и веб-приложений. Она работает на базе .NET Framework, предоставляя разработчикам доступ к широкому набору инструментов и библиотек. ASP.NET поддерживает множество языков программирования, включая C# и VB.NET, что делает её универсальной для различных задач.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Где используется IQueryable?

IQueryable используется для работы с данными в LINQ (Language Integrated Query) и позволяет создавать запросы, которые могут быть выполнены в различных источниках данных, таких как базы данных, XML-документы, коллекции объектов и другие. IQueryable поддерживает отложенное выполнение (deferred execution) запросов и предоставляет возможности для построения сложных запросов, которые могут быть оптимизированы и преобразованы в соответствующий язык запросов, например, SQL для работы с базами данных.

🚩Основные сценарии

🟠LINQ to SQL и Entity Framework
Одним из наиболее распространенных примеров использования IQueryable является работа с базами данных через ORM, такие как LINQ to SQL и Entity Framework. IQueryable позволяет создавать запросы, которые преобразуются в SQL-запросы и выполняются в базе данных.
using (var context = new MyDbContext())
{
IQueryable<User> usersQuery = context.Users.Where(u => u.Age > 30);

foreach (var user in usersQuery)
{
Console.WriteLine(user.Name);
}
}


🟠Отложенное выполнение (Deferred Execution)
Запросы, построенные с использованием IQueryable, выполняются только при их итерации (например, с помощью foreach) или при вызове методов, таких как ToList(), First(), Single(), Count() и т.д. Это позволяет строить запросы динамически, добавляя условия в зависимости от логики приложения.
IQueryable<User> usersQuery = context.Users;

if (includeInactive)
{
usersQuery = usersQuery.Where(u => !u.IsActive);
}

List<User> users = usersQuery.ToList();


🟠Поддержка сложных запросов
IQueryable позволяет создавать сложные запросы, включающие фильтрацию, сортировку, группировку и объединение данных.
var query = from user in context.Users
where user.Age > 30
orderby user.Name
select new { user.Name, user.Age };

foreach (var user in query)
{
Console.WriteLine($"{user.Name}, {user.Age}");
}


🟠Провайдеры LINQ
IQueryable часто используется провайдерами LINQ, которые могут преобразовывать выражения LINQ в специфичные для источника данных команды. Например, провайдер Entity Framework преобразует выражения LINQ в SQL-запросы.
public class MyCustomProvider : IQueryProvider
{
public IQueryable CreateQuery(Expression expression)
{
return new MyCustomQueryable(expression);
}

public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
return new MyCustomQueryable<TElement>(expression);
}

public object Execute(Expression expression)
{
// Логика выполнения запроса
}

public TResult Execute<TResult>(Expression expression)
{
// Логика выполнения запроса
}
}


🚩Примеры использования

Фильтрация и сортировка
using (var context = new MyDbContext())
{
IQueryable<User> query = context.Users
.Where(u => u.Age > 30)
.OrderBy(u => u.Name);

foreach (var user in query)
{
Console.WriteLine($"{user.Name}, {user.Age}");
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Что такое EF?

EF (Entity Framework) — это ORM (Object-Relational Mapping) для .NET, облегчающая работу с базами данных. С помощью EF разработчики могут манипулировать данными как объектами C# без необходимости писать SQL-код. Он автоматически преобразует объекты в SQL-запросы и обратно.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Как работают join`ы?

join в LINQ используется для объединения двух последовательностей на основе соответствия ключей. Вот краткие примеры, показывающие, как работают join в LINQ.

🚩Основные типы

🟠Inner Join
Соединяет элементы двух коллекций, если их ключи совпадают.
var query = from user in users
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };


🟠Group Join
Создает группы элементов из второй коллекции, соответствующие каждому элементу из первой коллекции.
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
select new { user.Name, Orders = userOrders };


🟠Left Join (нет прямой поддержки, можно имитировать с помощью DefaultIfEmpty)
Возвращает все элементы из первой коллекции и соответствующие элементы из второй коллекции, если они существуют.
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
from order in userOrders.DefaultIfEmpty()
select new { user.Name, OrderId = order?.OrderId };


🚩Примеры

Данных
var users = new List<User>
{
new User { Id = 1, Name = "Alice" },
new User { Id = 2, Name = "Bob" }
};

var orders = new List<Order>
{
new Order { OrderId = 101, UserId = 1 },
new Order { OrderId = 102, UserId = 1 },
new Order { OrderId = 103, UserId = 2 }
};


Inner Join
var query = from user in users
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };

foreach (var item in query)
{
Console.WriteLine($"{item.Name} - {item.OrderId}");
}


Group Join
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
select new { user.Name, Orders = userOrders };

foreach (var item in query)
{
Console.WriteLine($"{item.Name} has {item.Orders.Count()} orders");
}


Left Join
var query = from user in users
join order in orders on user.Id equals order.UserId into userOrders
from order in userOrders.DefaultIfEmpty()
select new { user.Name, OrderId = order?.OrderId };

foreach (var item in query)
{
Console.WriteLine($"{item.Name} - {item.OrderId}");
}


Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52👍2
🤔 В чем разница между асинхронностью и многопоточностью?

Асинхронность позволяет выполнять задачи без блокировки основного потока, в то время как многопоточность предполагает разделение кода на несколько потоков. Асинхронные операции выполняются в том же потоке, но не блокируют его, а многопоточность использует параллельные потоки для выполнения задач одновременно.\

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥21
🤔 Как оптимизировать ситуацию, когда к таблице много join`ов?

🟠Индексы
Создайте индексы на столбцах, используемых в условиях соединения (join).
CREATE INDEX idx_user_id ON Users(Id);
CREATE INDEX idx_order_user_id ON Orders(UserId);


🟠Избегайте ненужных полей
Выбирайте только необходимые столбцы, чтобы уменьшить объем данных.
var query = from user in users
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };


🟠Используйте отложенную загрузку (Lazy Loading)
Отложенная загрузка загружает данные только тогда, когда они действительно нужны.
var user = context.Users.Find(userId);
context.Entry(user).Collection(u => u.Orders).Load();


🟠Разделение на подзапросы
Разделите сложные запросы на подзапросы для улучшения читаемости и производительности.
var userIds = users.Select(u => u.Id).ToList();
var query = from order in orders
where userIds.Contains(order.UserId)
select order;


🟠Применяйте фильтрацию до join
Фильтруйте данные перед выполнением join, чтобы уменьшить размер соединяемых таблиц.
var filteredUsers = users.Where(u => u.IsActive);
var query = from user in filteredUsers
join order in orders on user.Id equals order.UserId
select new { user.Name, order.OrderId };


🟠Используйте оптимизированные ORM функции
Используйте функции ORM, которые могут генерировать более оптимизированные SQL-запросы.
var query = context.Users
.Where(u => u.IsActive)
.SelectMany(u => u.Orders, (user, order) => new { user.Name, order.OrderId });


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁2
🤔 Как используется ключевое слово await?

Ключевое слово await используется для приостановки выполнения метода до завершения асинхронной задачи. Оно позволяет освобождать текущий поток и возвращается к коду после завершения задачи. await применяется в асинхронных методах, объявленных с помощью async.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 Расскажи про метод ASP/Query?

Не является стандартным термином в ASP.NET или ASP.NET Core. Возможно, имеется в виду подход к созданию запросов или API-методов в ASP.NET Core для обработки HTTP-запросов. Рассмотрим, как создавать и обрабатывать запросы в ASP.NET Core.

🚩Создание и Обработка Запросов

🟠Создание контроллера
Контроллеры в ASP.NET Core отвечают за обработку HTTP-запросов и возврат ответов. Контроллеры обычно наследуются от класса ControllerBase или Controller.
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;

public UsersController(IUserService userService)
{
_userService = userService;
}

[HttpGet("{id}")]
public IActionResult GetUser(int id)
{
var user = _userService.GetUserById(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}

[HttpPost]
public IActionResult CreateUser([FromBody] User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_userService.CreateUser(user);
return CreatedAtAction(nameof(GetUser), new { id = user.Id }, user);
}
}


🟠Создание сервиса
Сервисы содержат бизнес-логику приложения. Обычно они регистрируются в контейнере зависимостей.
public interface IUserService
{
User GetUserById(int id);
void CreateUser(User user);
}

public class UserService : IUserService
{
private readonly List<User> _users = new List<User>();

public User GetUserById(int id)
{
return _users.FirstOrDefault(u => u.Id == id);
}

public void CreateUser(User user)
{
user.Id = _users.Count + 1;
_users.Add(user);
}
}


🟠Модель данных
Модель данных представляет структуру данных, с которой работает приложение.
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}


🟠Регистрация сервисов в контейнере зависимостей
Регистрация сервисов в Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<IUserService, UserService>();
}


🟠Настройка маршрутизации
Настройка маршрутизации для контроллеров в Startup.cs.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseRouting();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}


🚩Пример вызова API

GET-запрос для получения пользователя
GET /api/users/1


POST-запрос для создания пользователя
POST /api/users
Content-Type: application/json

{
"name": "Alice",
"age": 30
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4