动态linq:创建可产生JSON结果的扩展方法
时间:2020-03-05 18:49:31 来源:igfitidea点击:
我一直在尝试创建动态linq扩展方法,该方法以JSON格式返回字符串,而我正在使用System.Linq.Dynamic和Newtonsoft.Json,但我无法让Linq.Dynamic来解析" cell = new对象[]" 部分。也许太复杂了?有任何想法吗? :
我的主要方法:
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]} // ] // } } }
解决方案
回答
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); } }
回答
感谢我们及时的回复。
但是,请注意,所需的输出在"单元格"数组中没有属性名称(这就是我使用object []的原因):
" cell":[" FAMIA"," Familia Arquibaldo",...
与
" cell":{" CustomerID":" FAMIA"," CompanyName"," Familia Arquibaldo",...
该结果应与名为" flexify"的JQuery网格一起使用,该网格要求以这种格式输出。
回答
这确实很丑陋,并且字符串替换可能存在一些问题,但是会产生预期的结果:
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; } }