簡體   English   中英

C#和SQL Server:查詢需要很長時間

[英]C# & SQL Server : query takes long time

我有一個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;
}

您在循環內運行sql,因此它可能運行1000次。 這就是為什么它很慢。 我稱之為1 + N問題。 網絡連接(讀取輸入/輸出(IO)操作)通常很慢。

您需要更改代碼以通過1或2查詢(不是N)從SQL Server獲得所需的代碼。 然后,您可以循環處理內存中的數據。

而不是獲取類別,然后在循環中添加子類別,而是使用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));
    }
}

這是循環問題。 GetAll():我認為此方法正在獲取所有記錄,然后從內存中集合進行過濾。 創建通用方法以在服務器端執行查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM