Я пытаюсь профилировать запрос EF SQL в первую очередь базы данных в приложении ASP. NET Core 3.1 MVC, что, похоже, занимает немного времени.
После использования секундомера и попыток получить желаемую степень детализации, поэтому я установил MiniProfiler (замечательно, кстати, если у вас его нет, получите его).
В двух словах, функция получит запятую -Ограниченная строка идентификаторов деталей и возврат строки [] базовых идентификаторов рабочего задания;
string[] part_array = part.Split(',');
string[] base_id_array = { };
using (MiniProfiler.Current.Step("TestDB"))
{
using (DB_Access.AccessContext db_context = new DB_Access.AccessContext())
{
var query = from a in db_context.WorkOrder.AsNoTracking()
where part_array.Contains(a.User2)
select new
{
a.BaseId
};
if (query != null)
{
if (query.Any())
{
foreach (var item in query)
{
Array.Resize(ref base_id_array, base_id_array.Length + 1);
base_id_array[base_id_array.GetUpperBound(0)] = item.BaseId;
}
}
}
}
}
MiniProfiler показывает следующее:
введите описание изображения здесь
Итак, сначала EF выполняет запрос EXIST, который занимает 147,7 мс
Затем EF закрывает соединение, повторно открывается и выполняет фактический запрос SELECT, который занимает всего 40,4 мс
Полагаю, вопрос состоит из трех:
- Почему EF выполняет запрос EXIST?
- Почему запрос выполняется так чертовски долго?
- Почему закрывается и открывается ли соединение в том же операторе using?