.net 如何在Umbraco中加快节点迭代?

.net 如何在Umbraco中加快节点迭代?,.net,umbraco,.net,Umbraco,我编写了一个搜索网站的程序,该程序遍历某个文件夹下的所有节点,然后根据特定条件筛选出节点。该网站本身用于搜索公寓。以下是我用于构建集合的功能: private static List<Apartment> GetApartmentsCollection() { List<Apartment> apartmentsCollection = new List<Apartment>(); Docume

我编写了一个搜索网站的程序,该程序遍历某个文件夹下的所有节点,然后根据特定条件筛选出节点。该网站本身用于搜索公寓。以下是我用于构建集合的功能:

private static List<Apartment> GetApartmentsCollection()
        {
            List<Apartment> apartmentsCollection = new List<Apartment>();

            Document apartmentsContainer = new Document(Convert.ToInt32(ConfigurationManager.AppSettings["apartmentsContainerNodeId"]));

            if (apartmentsContainer.HasChildren)
            {
                Document[] buildings = apartmentsContainer.Children;
                foreach (Document building in buildings)
                {
                    if (building.Published)
                    {
                        // Store building id for apartment
                        int buildingId = building.Id;
                        if (building.HasChildren)
                        {
                            Document[] apartments = building.Children;
                            foreach (Document apartment in apartments)
                            {
                                if (apartment.Published)
                                {
                                    apartmentsCollection.Add(new Apartment(apartment.Id,
                                                                           buildingId,
                                                                           Convert.ToInt32(apartment.Text),
                                                                           (int)apartment.getProperty("apartmentType").Value,
                                                                           (int)apartment.getProperty("floor").Value,
                                                                           (int)apartment.getProperty("status").Value,
                                                                           (int)apartment.getProperty("bedrooms").Value,
                                                                           Convert.ToInt32(apartment.getProperty("price").Value),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room1").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room1").Value.ToString()),
                                                                           apartment.getProperty("room1Dimensions").Value.ToString(),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room2").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room2").Value.ToString()),
                                                                           apartment.getProperty("room2Dimensions").Value.ToString(),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room3").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room3").Value.ToString()),
                                                                           apartment.getProperty("room3Dimensions").Value.ToString(),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room4").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room4").Value.ToString()),
                                                                           apartment.getProperty("room4Dimensions").Value.ToString(),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room5").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room5").Value.ToString()),
                                                                           apartment.getProperty("room5Dimensions").Value.ToString(),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room6").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room6").Value.ToString()),
                                                                           apartment.getProperty("room6Dimensions").Value.ToString(),
                                                                           string.IsNullOrEmpty(apartment.getProperty("room7").Value.ToString()) == true ? -1 : Convert.ToInt32(apartment.getProperty("room7").Value.ToString()),
                                                                           apartment.getProperty("room7Dimensions").Value.ToString(),
                                                                           apartment.getProperty("totalArea").Value.ToString(),
                                                                           apartment.getProperty("projectArea").Value.ToString()));
                                }
                            }
                        }
                    }
                }
            }

            return apartmentsCollection;
        }
private静态列表GetApartmentsCollection()
{
List apartmentsCollection=新列表();
Document apartmentsContainer=新文档(转换为.ToInt32(ConfigurationManager.AppSettings[“apartmentsContainerNodeId]”);
if(有子女的公寓集装箱)
{
文件[]建筑物=公寓容器。儿童;
foreach(建筑物中的文件建筑)
{
if(building.Published)
{
//公寓的商店大楼id
int buildingId=building.Id;
if(建筑物.儿童)
{
文件[]公寓=建筑物。儿童;
foreach(公寓中的文件公寓)
{
如果(公寓,已出版)
{
apartmentsCollection.Add(新公寓),
buildingId,
转换.ToInt32(单元.Text),
(int)公寓。getProperty(“公寓类型”)。价值,
(内部)公寓物业(“楼层”)价值,
(int)公寓物业(“状态”).价值,
(int)公寓物业(“卧室”)。价值,
转换为32(公寓物业(“价格”).价值),
string.IsNullOrEmpty(plant.getProperty(“room1”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room1”).Value.ToString()),
apartment.getProperty(“room1Dimensions”).Value.ToString(),
string.IsNullOrEmpty(plant.getProperty(“room2”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room2”).Value.ToString()),
apartment.getProperty(“room2Dimensions”).Value.ToString(),
string.IsNullOrEmpty(plant.getProperty(“room3”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room3”).Value.ToString()),
apartment.getProperty(“room3Dimensions”).Value.ToString(),
string.IsNullOrEmpty(plant.getProperty(“room4”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room4”).Value.ToString()),
apartment.getProperty(“room4Dimensions”).Value.ToString(),
string.IsNullOrEmpty(plant.getProperty(“room5”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room5”).Value.ToString()),
apartment.getProperty(“room5Dimensions”).Value.ToString(),
string.IsNullOrEmpty(plant.getProperty(“room6”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room6”).Value.ToString()),
公寓.getProperty(“room6Dimensions”).Value.ToString(),
string.IsNullOrEmpty(plant.getProperty(“room7”).Value.ToString())==true?-1:Convert.ToInt32(plant.getProperty(“room7”).Value.ToString()),
公寓.getProperty(“room7Dimensions”).Value.ToString(),
公寓.getProperty(“totalArea”).Value.ToString(),
unity.getProperty(“projectArea”).Value.ToString();
}
}
}
}
}
}
返回公寓集合;
}
唯一的问题是,这需要8-10秒左右的时间(即使顶部只有约150个节点),这太长了

请记住,这只是为了检索原始集合。然后,我使用少量linq语句过滤出结果,这需要几秒钟的时间。最终,这将导致搜索约150个节点,耗时约15秒,这太长了

我怎样才能加快速度


谢谢

使用NodeFactory的节点访问您的数据而不是文档。文档访问数据库,这是性能问题的根源。NodeFactory访问Umbraco缓存,速度更快。有关更多详细信息,请参阅

另一件需要注意的事情是,缓存只包含已发布的节点。因此,您不必进行任何检查以查看它们是否已发布

使用NodeFactory的N