2016-03-30 19 views
0

Veri tabanından veri alan dapper mikro orm ile C# arka uçlu bir angularjs uygulaması yapıyorum.Verileri bu özel şekilde nasıl döndürebilirim

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; 


          } 
     } 
: Bu benim depoda ne var

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

ama bu benim veri

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

] 

neye benzediği:

Veri şuna benzer döndü istedi Ve bu benim Kategori ve Ürün Modellerim:

Ve bunlar benim Modeller

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

    } 

Lütfen birisi bana doğru yönde işaret edebilir mi?

Lütfen burada ne yapıyorum bilmeme izin verin. peşin

Teşekkür

+2

CategoryModel' 'Your' Item' tesiste 'list 'olmalıdır:getirmesi hem sonuç ayrı ayrı ayarlar, kod gibi görünecektir. Şu anda onun bir nesne ve dolayısıyla bir gibi serileştiriliyor. – M22an

cevap

2

beklediğim sonucu elde etmek için bir aşağıdaki yaklaşımı öneririz: aşağıda gösterildiği gibi

varlıkları değiştirin Newtonsoft Json seri önlemek için, ItemModel yılında CategoryId görmezden özelliklerini kullanmasına onun bir çoklu Item Model,kullanmak içeren Category Model içinde birçok haritalama, beri getirilirken veriler için Şimdi

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

    } 

,

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 sınıfını genişleterek bunu otomatik olarak yapmanın bir yolu var, ancak gördüğüm gibi Linq'i kullanmak tercih edilebilir mekanizma olacaktır –

+0

Teşekkür ederim. :) – aliaz