2008-09-08 43 views
2

我被困在試圖創建一個返回JSON格式的字符串的動態linq擴展方法 - 我使用System.Linq.Dynamic和Newtonsoft.Json,我可以讓Linq.Dynamic解析「cell = new object []」部分。也許太複雜?有任何想法嗎? :動態linq:創建生成JSON結果的擴展方法

我的主要方法:

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類

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

    } 

} 

回答

1

這實在是太醜了,有可能會出現一些問題上與字符串替換,但它產生預期的結果:

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

感謝您的快速反應。 但是,請注意所需的輸出在「單元格」數組中沒有屬性名稱(這就是爲什麼我使用object []):

「cell」:[「FAMIA」,「Familia Arquibaldo」,... 與 「細胞」:{「客戶ID」:「FAMIA」,「公司名稱」,「福美來Arquibaldo」,...

結果是爲了與所謂的「flexify」這需要一個jQuery網格使用以這種格式輸出。