2016-03-30 6 views
0

Ich baue eine angularjs App mit einem C# Backend mit Dapper Micro Orm, die mir Daten aus der Datenbank holt.Wie kann ich Daten auf diese spezifische Weise zurückgeben?

Ich wollte, dass die Daten wie folgt aussehen zurückgegeben:

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

aber das ist, was meine Daten wie

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

] 

Dies ist, was in meinem Repository Ich habe aussieht:

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; 


          } 
     } 

Und das sind meine Kategorie und Artikel

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

    } 

Könnte mir bitte jemand in die richtige Richtung zeigen?

Bitte lassen Sie mich wissen, was ich hier falsch mache.

Vielen Dank im Voraus

+2

Ihre 'Item' Eigenschaft in' CategoryModel' sollte ein 'list' sein. Im Moment ist es ein Objekt und somit deserialisiert wie eins. – M22an

Antwort

2

Ich möchte einen folgenden Ansatz vorschlagen, das erwartete Ergebnis zu erreichen:

Ändern Sie die Einheiten, wie unten gezeigt, verwenden Newtonsoft Json die CategoryId im ItemModel, zu ignorieren, schreibt die Serialisierung zu vermeiden

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

    } 

Nun zum Abrufen von Daten, da sie einer bis viele-Mapping innerhalb der Category Model, die mehr Item Model enthalten, verwenden, um die 0.123.zu holen beide das Ergebnis setzt separat, wird Code wie folgt aussehen:

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

Es gibt eine Möglichkeit, es automatisch zu tun, indem GridReader-Klasse zu erweitern, aber mit Linq, wie ich gezeigt habe, würde Mechanismus –

+0

sein Dank Ich werde dies versuchen. :) – aliaz