2016-07-05 5 views
1

Nachdem ein EF-Objekt (users zum Beispiel) mit Daten bevölkerten und schicken Sie es ab WebAPI, bekomme ich es im JSON-Format wie folgt:Return EF Objekt als normale Array in C#

[ 
    {"username":"lakshman553","email":"[email protected]","phone":1234567}, 
    {"username":"lakshman323","email":"[email protected]","phone":"122267"}, 
] 

Da ich die WebAPI verwenden vollständig für interne Zwecke, würde ich eher die Daten wie folgt Stellung:

[ 
    ["lakshman553","[email protected]",1234567], 
    ["lakshman323","[email protected]",1222267] 
] 

i die Nutzlast drastisch, indem Sie auf diese Weise verringert werden kann, wenn die Daten hoch ist, was typischerweise der Fall ist.

So erreichen Sie dies in C#. Das Iterieren durch das users Objekt und das Zuordnen zu einem sortierten Array von Zeilen- und Spaltenzählern ist ein Ansatz, den ich kenne, aber gibt es eine direkte Methode dafür?

danke.

+0

Wenn Sie Datenmenge Pflege übertragen werden, sollten effizientere Serialisierung Ansatz (BSON, protobuf) anstelle benutzerdefinierte Mapping-Code schreiben . – Dennis

Antwort

2

Sie diese Transformation implementieren könnte LINQ-Erweiterungsmethoden verwenden, wie folgt:

// Project each list item into an array of item property values 
var array4all = list.Select 
(
    item => item.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) 
          .Select(property => property.GetValue(item)) 
          .ToArray() 
).ToArray(); 

BTW, IMHO über diesen Satz von mir aus:

Da ich verwende die WebAPI vollständig für interne Zwecke [ ...]

Ich glaube, Sie versuchen, das Problem zu vereinfachen, indem Sie ein neues Problem erstellen. In Bezug auf Kodierung, Lesbarkeit und Wartbarkeit finde ich, dass Sie die Dinge verschärfen.

Vielleicht so etwas wie das Verschleiern von Eigenschaftsnamen zu a, b, c .... und man könnte AutoMapper verwenden, um eine dynamic DTOto your actual model/DTO with full property names abzubilden. Etwas wie:

{ "a": "hello world", "b": 20 } => { "text": "hello world", "number": 20 } 

Oder Sie einen Blick auf MsgPack nehmen, BSON ...

1

Wenn Sie Ihren Server-Antwort gzip (die Sie sollten), dann werden diese wiederholt Eigenschaftsnamen nicht wirklich viel aus . Auf der anderen Seite, die Eigenschaften als Eigenschaften zu haben macht die Handhabung der Daten viel einfacher für den Anbieter und den Verbraucher.

Sie sagen, Sie verwenden es nur für interne Zwecke, aber Sie müssen immer noch einen benutzerdefinierten Parsing-Mechanismus dafür erstellen, wenn Sie diese Daten konsumieren. Um dies zu tun, müssen Sie einen konsistenten Weg haben, so dass Sie zusätzliche Verträge benötigen, die z. die Reihenfolge der Eigenschaften und - bei der Analyse in C# - auch seine Typen usw.

Das ist eine Menge Overhead nur um die Bandbreite zu reduzieren, was, wie ich oben sagte, nicht wirklich viel ausmacht, sobald Sie die Daten gzip.