2008-09-08 7 views
2

Ich stecke beim Versuch, eine dynamische Linq-Erweiterung-Methode, die eine Zeichenfolge im JSON-Format zurückgibt erstellen - ich benutze System.Linq.Dynamic und Newtonsoft.Json und ich kann Erhalte die Linq.Dynamic nicht, um den Teil "cell = new object []" zu parsen. Vielleicht zu komplex? Irgendwelche Ideen? :Dynamic linq: Erstellen einer Erweiterungsmethode, die JSON-Ergebnis erzeugt

Meine Hauptmethode:

static void Main(string[] args) 
{ 
    NorthwindDataContext db = new NorthwindDataContext(); 
    var query = db.Customers; 
    string json = JSonify<Customer> 
        .GetJsonTable(
         query, 
         2, 
         10, 
         "CustomerID" 
         , 
         new string[] 
          { 
           "CustomerID", 
           "CompanyName", 
           "City", 
           "Country", 
           "Orders.Count" 
          }); 
    Console.WriteLine(json); 
} 

JSonify Klasse

public static class JSonify<T> 
{ 
    public static string GetJsonTable(
     this IQueryable<T> query, 
     int pageNumber, 
     int pageSize, 
     string IDColumnName, 
     string[] columnNames) 
    { 
     string selectItems = 
      String.Format(@" 
         new 
         { 
          {{0}} as ID, 
          cell = new object[]{{{1}}} 
         }", 
          IDColumnName, 
          String.Join(",", columnNames)); 

     var items = new 
     { 
      page = pageNumber, 
      total = query.Count(), 
      rows = 
       query 
        .Select(selectItems) 
        .Skip(pageNumber * pageSize) 
        .Take(pageSize) 
     }; 

     return JavaScriptConvert.SerializeObject(items); 
     // Should produce this result: 
     // { 
     // "page":2, 
     // "total":91, 
     // "rows": 
     //  [ 
     //  {"ID":"FAMIA","cell":["FAMIA","Familia Arquibaldo","Sao Paulo","Brazil",7]}, 
     //  {"ID":"FISSA","cell":["FISSA","FISSA Fabrica Inter. Salchichas S.A.","Madrid","Spain",0]}, 
     //  {"ID":"FOLIG","cell":["FOLIG","Folies gourmandes","Lille","France",5]}, 
     //  {"ID":"FOLKO","cell":["FOLKO","Folk och fä HB","Bräcke","Sweden",19]}, 
     //  {"ID":"FRANK","cell":["FRANK","Frankenversand","München","Germany",15]}, 
     //  {"ID":"FRANR","cell":["FRANR","France restauration","Nantes","France",3]}, 
     //  {"ID":"FRANS","cell":["FRANS","Franchi S.p.A.","Torino","Italy",6]}, 
     //  {"ID":"FURIB","cell":["FURIB","Furia Bacalhau e Frutos do Mar","Lisboa","Portugal",8]}, 
     //  {"ID":"GALED","cell":["GALED","Galería del gastrónomo","Barcelona","Spain",5]}, 
     //  {"ID":"GODOS","cell":["GODOS","Godos Cocina Típica","Sevilla","Spain",10]} 
     //  ] 
     // } 

    } 

} 

Antwort

1

Das ist wirklich hässlich und es kann einige Probleme mit dem String-Ersatz, aber es erzeugt die erwarteten Ergebnisse:

public static class JSonify 
{ 
    public static string GetJsonTable<T>(
     this IQueryable<T> query, int pageNumber, int pageSize, string IDColumnName, string[] columnNames) 
    { 
     string select = string.Format("new ({0} as ID, \"CELLSTART\" as CELLSTART, {1}, \"CELLEND\" as CELLEND)", IDColumnName, string.Join(",", columnNames)); 
     var items = new 
     { 
      page = pageNumber, 
      total = query.Count(), 
      rows = query.Select(select).Skip((pageNumber - 1) * pageSize).Take(pageSize) 
     }; 
     string json = JavaScriptConvert.SerializeObject(items); 
     json = json.Replace("\"CELLSTART\":\"CELLSTART\",", "\"cell\":["); 
     json = json.Replace(",\"CELLEND\":\"CELLEND\"", "]"); 
     foreach (string column in columnNames) 
     { 
      json = json.Replace("\"" + column + "\":", ""); 
     } 
     return json; 
    } 
} 
0
static void Main(string[] args) 
{ 
    NorthwindDataContext db = new NorthwindDataContext(); 
    var query = db.Customers; 
    string json = query.GetJsonTable<Customer>(2, 10, "CustomerID", new string[] {"CustomerID", "CompanyName", "City", "Country", "Orders.Count" }); 
} 

public static class JSonify 
{ 
    public static string GetJsonTable<T>(
     this IQueryable<T> query, int pageNumber, int pageSize, string IDColumnName, string[] columnNames) 
    { 
     string select = string.Format("new ({0} as ID, new ({1}) as cell)", IDColumnName, string.Join(",",  columnNames)); 
     var items = new 
     { 
      page = pageNumber, 
      total = query.Count(), 
      rows = query.Select(select).Skip((pageNumber - 1) * pageSize).Take(pageSize) 
     }; 
     return JavaScriptConvert.SerializeObject(items); 
    } 
} 
0

Danke für die schnelle Antwort. Beachten Sie jedoch, dass die erforderliche Ausgabe keine Eigenschaftsnamen im "cell" -Array hat (deshalb habe ich das Objekt []) verwendet:

"Zelle": ["FAMIA", "Familia Arquibaldo", ... vs. "Zelle": { "CustomerID": "FAMIA", "Company", "Familia Arquibaldo", ...

Das Ergebnis bedeutet, wird mit einem JQuery grid "flexify" genannt verwendet werden, die erfordert, die Ausgabe in diesem Format.

Verwandte Themen