2008-09-08 28 views
2

Je suis bloqué en essayant de créer une méthode d'extension linq dynamique qui retourne une chaîne au format JSON - J'utilise System.Linq.Dynamic et Newtonsoft.Json et je peux N'obtenez pas le Linq.Dynamic pour analyser la partie "cell = new object []". Peut-être trop complexe? Des idées? :Linq dynamique: Création d'une méthode d'extension qui produit le résultat JSON

Ma principale méthode:

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 classe

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]} 
     //  ] 
     // } 

    } 

} 

Répondre

1

C'est vraiment laid et il peut y avoir quelques problèmes avec le remplacement de la chaîne, mais elle produit les résultats escomptés:

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

Merci pour la réponse rapide. Cependant, notez que la sortie requise n'a pas de noms de propriété dans le tableau "cell" (c'est pourquoi j'utilisais object []):

"cell": ["FAMIA", "Familia Arquibaldo", ... vs "cellule": { "CustomerID": "Famia", "CompanyName", "Familia Arquibaldo", ...

Le résultat est destiné à être utilisé avec une grille JQuery appelée "flexify" qui exige la sortie dans ce format.