【解決方法】ツリーモデルが正常に動作しない


こんにちは!

最近、.net 6 と新しい EF バージョンに移行しました。
コード内のツリー モデルが意図したとおりに動作しません。
私のデータには、いくつかの店舗、いくつかの都市、いくつかの国があります。

それらは次のように表示されるはずです。

HTML
---> Country 1
   ---> City 1
      --->Store 1
      --->Store 2
      --->Store 3
      ---Etc....
   ---> City 2
      --->Store 1
      --->Store 2
      --->Store 3
      ---Etc....
---> Country 2
   ---> City 1
      --->Store 1
      --->Store 2
      --->Store 3
      ---Etc....
   ---> City 2
      --->Store 1
      --->Store 2
      --->Store 3
      ---Etc....
---> Country 3
   ---> City 1
      --->Store 1
      --->Store 2
      --->Store 3
      ---Etc....
   ---> City 2
      --->Store 1
      --->Store 2
      --->Store 3
      ---Etc....

ただし、現在データは次のように表示されています。

HTML
---> Country 1
   ---> City 1
      --->Store 1
---> Country 1
   ---> City 1
      --->Store 2
---> Country 1
   ---> City 2
      --->Store 1
---> Country 1
   ---> City 2
      --->Store 2
---> Country 2
   ---> City 1
      --->Store 1
---> Country 2
   ---> City 1
      --->Store 2

したがって、国をグループ化し、都市も国の下にグループ化するのではなく、ツリーの新しい個別のノードに各行を単独で表示します。

この問題はどうすれば解決できますか? おそらくEFが原因かと思いますが、試してみても解決しませんでした。

以下に使用されるコードを示します。

私が試したこと:

C#
var foundedTradeCenters = _tradeCenterService
                .FindTradeCenters(request.FilterByName, request.FilterByManager)
                .Include(tc => tc.City.Cluster.Region.Country)
                .ToList();

            var tcGroup = foundedTradeCenters
                .GroupBy(g => g.City)
                .GroupBy(g => g.Key.Cluster.Region.Country)
                .OrderBy(g => g.Key.Name)
                .AsEnumerable();
            
            var result = tcGroup
                .Select(s => new TreeModel()
                {
                    Text = s.Key.Name,
                    Type = TreeModel.NodeTypeName,
                    Children = s.Select(c => new TreeModel()
                    {
                        Text = c.Key.Name,
                        Type = TreeModel.NodeTypeName,
                        Children = c.Select(t => new TreeModel()
                        {
                            Id = t.Id,
                            Type = TreeModel.LeafTypeName,
                            Text = t.Name
                        }).OrderBy(n => n.Text)
                    }).OrderBy(n => n.Text)
                });

            return Json(result);

tcGroup 変数の結果は次の 2 つの画像にあります。 tcグループ画像[^]

結果変数: 結果 [^]

その結果、新しい葉が生まれるたびに国が繰り返され、3 か国しかありませんが、表示する店舗は 1500 件になります。 最初に 3 か国だけを拡張するのではなく、これら 3 か国を 1500 回繰り返して拡張します。

解決策 1

完全なコードは提供できませんが、その方法については説明します…
エントリを繰り返し処理し、最初にルート ノード (およびルート ノードのみ) を作成し、すべてのエントリについてルート ノードがすでに存在するかどうかを確認する必要があります。
この後、もう一度繰り返して、エントリごとに、一致するルートノードを調べて、そこにエントリを作成する必要があります。ただし、ここでは、そのエントリがそのルートノードの下にすでに存在するかどうかも調べる必要があります。
お互いの子供レベルと同じです…

コメント

タイトルとURLをコピーしました