C#和SQL Server:查询需要很长时间

时间:2018-07-07 11:42:44

标签: 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;
}

3 个答案:

答案 0 :(得分:1)

您在循环内运行sql,因此它可能运行1000次。这就是为什么它很慢。我称之为1 + N问题。网络连接(读取输入/输出(IO)操作)通常很慢。

您需要更改代码以通过1或2查询(不是N)从SQL Server获得所需的代码。然后,您可以循环处理内存中的数据。

答案 1 :(得分: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));
    }
}

答案 2 :(得分:-1)

这是循环问题。 GetAll():我认为此方法正在获取所有记录,然后从内存中集合进行过滤。创建通用方法以在服务器端执行查询。