我有一个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;
}
答案 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():我认为此方法正在获取所有记录,然后从内存中集合进行过滤。创建通用方法以在服务器端执行查询。