2016-03-30 33 views
0

我正在用c#後端與微軟的微軟orm構建一個angularjs應用程序,該應用程序從數據庫獲取數據。我怎樣才能以這種特定的方式返回數據

我想返回的數據看起來像這樣:

[{ 
     "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; } 

    } 

難道有人請指點我正確的方向嗎?

請讓我知道我在做什麼錯在這裏。

在此先感謝

+2

'CategoryModel'中的'Item'屬性應該是'List'。目前它是一個對象,因此被反序列化爲一個對象。 – M22an

回答

2

我建議一個下面的方法來達到預期的結果:

修改實體,如下圖所示,使用Newtonsoft的Json屬性忽略CategoryIdItemModel,避免了系列化

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


          } 
     } 
+0

有一種方法可以自動完成,通過擴展GridReader類,但使用Linq,因爲我已經表明會更好的機制 –

+0

謝謝我會試試這個。 :) – aliaz

相關問題