【问题标题】:How to generate treeview using Linq如何使用 Linq 生成树视图
【发布时间】:2021-07-27 11:27:30
【问题描述】:

我有以下三张表,

区域表,

RegionId RegionName
1 Admin
2 North Region
3 South Region

分支表

BranchId BranchName FkRegionId
1 Roswell Rd 3
2 Test 2
3 Piedmont Ave 2
4 Ashford Dunwoody 1

用户表

UserId FirstName FkBranchId
1 Hasa 9
2 Jane 1
3 Joyce 7
4 Jane 1
5 John 3
6 Sharon 8

如上所述,每个分支都有自己的区域,每个用户都有一个分支。我需要为我的前端使用创建以下 JSON。因此,我需要填充数据以创建此 JSON。

Region1
    Branch1
        Jane
        Paul
        Alex
    Branch2
        Neil
        Kaja
        Alex
Region2
    Branch4
        Ama
        Hema
        Ira
    Branch5
        Laura
        Tim
        Yea 

如何使用 C# 和 linq 做到这一点?

【问题讨论】:

  • 到目前为止你尝试过什么?您的实施没有按预期工作吗?
  • @DekuDesu 先生,我对 linq 有点陌生,我很难想象如何做这样的事情
  • 我假设您的数据在数据库中。使用 linq 是您无法避免的要求吗?因为如果您不熟悉 linq 但您知道如何使用常规 SQL 检索数据,我建议您使用 SQL 方式。
  • @Cleptus 但问题是,这个项目没有使用 SQL 并使用 EF。 :( 这是我们大学的项目要求
  • 获取主根对象及相关数据并序列化。牛顿软件...

标签: c# json linq


【解决方案1】:

您需要使用 Linq JoinGroupBy 如下:

var regions = new List<Region>()
{
    new Region() { RegionId = 1, RegionName = "Admin" },
    new Region() { RegionId = 2, RegionName = "North Region" },
    new Region() { RegionId = 3, RegionName = "South Region" }
};

var branchs = new List<Branch>()
{
    new Branch() {BranchId = 1, BranchName = "Roswell Rd", FkRegionId = 3},
    new Branch() {BranchId = 2, BranchName = "Test", FkRegionId = 2},
    new Branch() {BranchId = 3, BranchName = "Piedmont Ave  ", FkRegionId = 2},
    new Branch() {BranchId = 4, BranchName = "Ashford Dunwoody  ", FkRegionId = 1},
};

var users = new List<User>()
{
    new User() {UserId = 1, FirstName = "Hasa", FkBranchId = 9},
    new User() {UserId = 2, FirstName = "Jane", FkBranchId = 1},
    new User() {UserId = 3, FirstName = "Joyce", FkBranchId = 7},
    new User() {UserId = 4, FirstName = "Jane", FkBranchId = 1},
    new User() {UserId = 5, FirstName = "John", FkBranchId = 3},
    new User() {UserId = 6, FirstName = "Sharon", FkBranchId = 8},
};


var tree = from user in users
           join branch in branchs on user.FkBranchId equals branch.BranchId
           join region in regions on branch.FkRegionId equals region.RegionId
           group region by new { region.RegionId, branch.BranchId } into grp
           select new
           {
               RegionName = regions.FirstOrDefault(s => s.RegionId == grp.Key.RegionId).RegionName,
               Branchs = new
               {
                   BranchName = branchs.FirstOrDefault(s => s.FkRegionId == grp.Key.RegionId).BranchName,
                   Users = users.Where(i => i.FkBranchId == grp.Key.BranchId).Select(s => new
                   {
                       FirstName = s.FirstName
                   })
               }
           };


var json = JsonConvert.SerializeObject(tree, Formatting.Indented);

这会给你一个预期的结果:

[
  {
    "RegionName": "South Region",
    "Branchs": {
      "BranchName": "Roswell Rd",
      "Users": [
        {
          "FirstName": "Jane"
        },
        {
          "FirstName": "Jane"
        }
      ]
    }
  },
  {
    "RegionName": "North Region",
    "Branchs": {
      "BranchName": "Test",
      "Users": [
        {
          "FirstName": "John"
        }
      ]
    }
  }
]

【讨论】:

【解决方案2】:

如果这些是物理相关的表,那么 EF 已经处理了它。只需确保您的延迟加载已打开,或者您也可以使用 include 预先加载数据,然后按原样显示数据。如果您想急切加载信息,请尝试此查询

using(var db = new DBContext){
  var result = db.region.include(x => x.branches).theninclude(x => x.users).toList();
}

result 将包含您的所有数据,然后将该数据绑定到您自定义的 DTO 中,或者您可以直接将实体模型绑定到视图中。 它概述了您可以拥有自己的实现的代码。

如果表之间没有物理关系,则使用 linq 进行连接,这是您可以了解连接在 linq 中的工作方式的链接。

link

【讨论】:

  • 根据数据量延迟加载将是一个非常糟糕的主意。 #join_the_eager_loading_gang
  • 是的,Cleptus 你是对的,这就是我提供急切加载查询的原因,但在一些小型项目中,延迟加载并不重要,因为数据较少。
【解决方案3】:
var jsonResponse = "[{\"UserId\":195,\"FirstName\":\"Carlton\",\"BranchId\":4,\"BranchName\":\"Test\",\"RegionId\":1,\"RegionName\":\"Admin\"},{\"UserId\":223,\"FirstName\":\"Lorenza\",\"BranchId\":4,\"BranchName\":\"Test\",\"RegionId\":1,\"RegionName\":\"Admin\"},{\"UserId\":163,\"FirstName\":\"Alice\",\"BranchId\":17,\"BranchName\":\"Ratnapura\",\"RegionId\":1,\"RegionName\":\"Admin\"},{\"UserId\":264,\"FirstName\":\"Karen\",\"BranchId\":7,\"BranchName\":\"Peachtree\",\"RegionId\":3,\"RegionName\":\"South Region\"},{\"UserId\":266,\"FirstName\":\"Starla\",\"BranchId\":7,\"BranchName\":\"Peachtree\",\"RegionId\":3,\"RegionName\":\"South Region\"},{\"UserId\":30,\"FirstName\":\"Jane\",\"BranchId\":9,\"BranchName\":\"Henderson Mill\",\"RegionId\":3,\"RegionName\":\"South Region\"}]";

var myDeserializedClass = JsonConvert.DeserializeObject < List < Root >> (jsonResponse);
var jsonResponseList = myDeserializedClass.GroupBy(item = >item.RegionId).Select(grp = >grp.GroupBy(item = >item.BranchId)).Select(grp = >grp.Select(innerg = >innerg.GroupBy(item = >item.UserId))).ToList();

var serializer = JsonConvert.SerializeObject(jsonResponseList, Formatting.Indented);

根类

public class Root
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public int BranchId { get; set; }
    public string BranchName { get; set; }
    public int RegionId { get; set; }
    public string RegionName { get; set; }
}

和输出:

[
  [
    [
      [
        {
          "UserId": 195,
          "FirstName": "Carlton",
          "BranchId": 4,
          "BranchName": "Test",
          "RegionId": 1,
          "RegionName": "Admin"
        }
      ],
      [
        {
          "UserId": 223,
          "FirstName": "Lorenza",
          "BranchId": 4,
          "BranchName": "Test",
          "RegionId": 1,
          "RegionName": "Admin"
        }
      ]
    ],
    [
      [
        {
          "UserId": 163,
          "FirstName": "Alice",
          "BranchId": 17,
          "BranchName": "Ratnapura",
          "RegionId": 1,
          "RegionName": "Admin"
        }
      ]
    ]
  ],
  [
    [
      [
        {
          "UserId": 264,
          "FirstName": "Karen",
          "BranchId": 7,
          "BranchName": "Peachtree",
          "RegionId": 3,
          "RegionName": "South Region"
        }
      ],
      [
        {
          "UserId": 266,
          "FirstName": "Starla",
          "BranchId": 7,
          "BranchName": "Peachtree",
          "RegionId": 3,
          "RegionName": "South Region"
        }
      ]
    ],
    [
      [
        {
          "UserId": 30,
          "FirstName": "Jane",
          "BranchId": 9,
          "BranchName": "Henderson Mill",
          "RegionId": 3,
          "RegionName": "South Region"
        }
      ]
    ]
  ]
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多