C # и SQL Server: запрос занимает много времени

У меня есть проект ASP.NET MVC и список категорий и список подкатегорий для каждой категории. Мой запрос занимает много времени. Спасибо за ответы.

// Create Sub Cat List 
List<CategoryVM> catlist = (List<CategoryVM>)catServices.GetAll();

for (int i = 0; i < catlist.Count(); i++)
{
    List<SubCategoryVM> subCatById = subCatServices.GetAll().Where(x => x.Category_Id == catlist[i].Id).ToList();

    foreach (SubCategoryVM item in subCatById)
    {
        catlist[i].SubCategoryVM.Add(item);
    }
}

ViewData["CatAndSubcatList"] = catlist;

И мой код обслуживания:

public IEnumerable<CategoryVM> GetAll()
{
    var data = ProjectMapper.ConvertToVMList<IEnumerable<CategoryVM>>(_CategoryRepository.GetAll());
    return (IEnumerable<CategoryVM>)data;
}

c#,sql-server,

0

Ответов: 3


1 принят

Вместо того, чтобы получать категории, а затем добавлять подкатегории в цикле, используйте LINQ и получайте их за один вызов. У нас нет вашей модели, поэтому этот пример можно догадаться:

var catlist = dbContext.CategoryVM.Include("SubCategoryVM").ToList();

Это ваш код отредактирован. Вместо того чтобы получать все категории, а затем снова и снова получать все подкатегории в цикле, он получает списки из базы данных только один раз и делает остальное локально:

//Create Sub Cat List 
List<CategoryVM> catlist = (List<CategoryVM>)catServices.GetAll();
List<SubCategoryVM> subCats = subCatServices.GetAll();

for (int i = 0; i < catlist.Count(); i++)
{
    foreach (SubCategoryVM item in subCatById)
    {
        catlist[i].SubCategoryVM.AddRange(subCats.Where(x => x.Category_Id == catlist[i].Id));
    }
}

1

Вы запускаете внутренний цикл sql, чтобы он мог запускаться 1000 раз. Вот почему он медленный. Я называю это проблемой 1 + N. Сетевое соединение (чтение операций ввода / вывода (IO)) обычно медленное.

Вам нужно изменить свой код, чтобы получить то, что вы хотите от SQL Server, в 1 или 2 запросе (а не в N). Затем вы можете получить цикл для обработки ваших данных в памяти.


-1

Это проблема цикла. GetAll (): Я думаю, что этот метод получает всю запись, затем вы фильтруете из коллекции In-memory. Создайте общий метод для выполнения запроса на стороне сервера.

C #, SQL-сервер,
Похожие вопросы