1

特定のフォルダーの下のすべてのノードを反復処理し、特定の基準に基づいてノードを除外する Web サイトの検索を作成しました。サイト自体は、アパートを検索するために使用されます。コレクションを構築するための関数は次のとおりです。

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;
        }

唯一の問題は、これに 8 ~ 10 秒ほどかかることです (ノードのトップが 150 までしかないにもかかわらず)。これは長すぎます。

これは生のコレクションを取得するためだけのものであることに注意してください。次に、さらに数秒かかる一握りの linq ステートメントを使用して結果を除外します。最終的に、これは約 15 秒かかる約 150 ノードの検索につながり、これは長すぎます。

どうすればこれをスピードアップできますか?

ありがとう

4

1 に答える 1

4

Document の代わりに NodeFactory の Node を使用してデータにアクセスします。ドキュメントはデータベースにアクセスします。これがパフォーマンスの問題の原因です。NodeFactory は Umbraco キャッシュにアクセスし、はるかに高速です。詳細については、ノードとドキュメントの違いを参照してください。

もう 1 つの注意点は、キャッシュには公開されたノードのみが含まれていることです。したがって、公開されているかどうかを確認する必要はありません。

于 2012-11-08T03:34:13.693 に答える