我如何以这种特定方式 return 数据

How can I return data in this specific way

我正在构建一个 angularjs 应用程序,它有一个 c# 后端和 dapper micro orm,它从数据库中获取数据。

我希望返回的数据看起来像这样:

[{
        "CategoryId": 1,
        "CategoryName": "cat1",
        "Items": [{
            "ItemId": 1,
            "ItemName": "Item1"
        }, {
            "ItemId": 2,
            "ItemName": "Item2"
        }]
    }, {
        "CategoryId": 2,
        "CategoryName": "cat2",
        "Items": [{
            "ItemId": 3,
            "ItemName": "Item3"
        }, {
            "ItemId": 4,
            "ItemName": "Item4"
        }]
    }
]

但这就是我的数据的样子

[{
        "CategoryId": 1,
        "CategoryName": "cat1",
        "Items": {
            "ItemId": 1,
            "ItemName": "Item1"
        }
    }, {
        "CategoryId": 1,
        "CategoryName": "cat1",
        "Items": {
            "ItemId": 2,
            "ItemName": "Item2"
        }
    },


    {
        "CategoryId": 2,
        "CategoryName": "cat2",
        "Items": {
            "ItemId": 3,
            "ItemName": "Item3"
        }
    },

    {
        "CategoryId": 2,
        "CategoryName": "cat2",
        "Items": {
            "ItemId": 4,
            "ItemName": "Item4"
        }
    }

]

这是我存储库中的内容:

public IEnumerable<CategoryModel> GetAllCategories()
        {
            using (var conn = ConnectionSettings.GetSqlConnection())
                  {
                      const string sql = @" SELECT
                            c.CategoryName,     
                            c.CategoryId,
                            i.ItemId,
                            i.ItemName,                                
                            i.CategoryId 
                        from Category c
                        INNER JOIN item i ON  c.CategoryId = i.CategoryId";   


    var categoriesList = conn.Query<CategoryModel, ItemModel, CategoryModel>(sql, (cat, it) =>
                              {
                                  cat.Item = it;
                                  return cat;
                              }, splitOn: "ItemId");

                              return categoriesList;


                          }
        }

这些是我的类别和项目模型

 public class CategoryModel
    {

        public int CategoryId { get; set; }
        public string CategoryName { get; set; }

        public ItemModel Item { get; set; }

    }


public class ItemModel
    {
        public int ItemId { get; set; }
        public int CategoryId { get; set; }
        public string ItemName { get; set; }

    }

有人能给我指出正确的方向吗?

请让我知道我在这里做错了什么。

提前致谢

我建议采用以下方法来实现预期结果:

修改实体如下图,使用Newtonsoft Json属性忽略ItemModel中的CategoryId,避免序列化

[JsonObject]
public class CategoryModel
    {

        public int CategoryId { get; set; }

        public string CategoryName { get; set; }

        public IEnumerable<ItemModel> Items { get; set; }

    }

[JsonObject]
public class ItemModel
    {
        public int ItemId { get; set; }

        [JsonIgnore] 
        public int CategoryId { get; set; }

        public string ItemName { get; set; }

    }

现在获取数据,因为它在 Category Model 中的一对多映射,其中包含多个 Item Model,使用 QueryMultiple 分别获取两个结果集,代码将看起来像:

public IEnumerable<CategoryModel> GetAllCategories()
        {
            using (var conn = ConnectionSettings.GetSqlConnection())
                  {
                      const string sql = @" SELECT
                            c.CategoryName,     
                            c.CategoryId from Category c;
                            SELECT
                            i.ItemId,
                            i.ItemName,                                
                            i.CategoryId 
                        from item i";   


    var reader = conn.QueryMultiple(sql);

    IEnumerable<CategoryModel> categoriesList = reader.Read<CategoryModel>();

     IEnumerable<ItemModel> itemList = reader.Read<ItemModel>();


    foreach(Category c in categoriesList)
    {
       c.items = itemList.Where(i => i.CategoryId = c.CategoryId)
    }

    return categoriesList;


                          }
        }