2014-10-02 60 views
3

我有一些JSON需要在C#中排序。我試圖使用System.Linq.DynamicJObject s列表進行排序,但我無法使其與Newtonsoft.Json.Linq.JObject的實例一起使用。使用動態LINQ對一個或多個屬性排序JSON

這工作:

public class Row 
{ 
    public String Column1 { get; set; } 
    public Int32 Column2 { get; set; } 
} 

var rows = new List<Row>(); 

rows.Add(new Row { Column1 = "B", Column2 = 2 }); 
rows.Add(new Row { Column1 = "B", Column2 = 1 }); 
rows.Add(new Row { Column1 = "A", Column2 = 2 }); 
rows.Add(new Row { Column1 = "A", Column2 = 1 }); 

var sortedRows = rows.AsQueryable().OrderBy("Column1, Column2"); 

這不:

var rows = new List<JObject>(); 

var row1 = new JObject(); 
row1["Column1"] = "B"; 
row1["Column2"] = 2; 
rows.Add(row1); 

var row2 = new JObject(); 
row2["Column1"] = "B"; 
row2["Column2"] = 1; 
rows.Add(row2); 

var row3 = new JObject(); 
row3["Column1"] = "A"; 
row3["Column2"] = 2; 
rows.Add(row3); 

var row4 = new JObject(); 
row4["Column1"] = "A"; 
row4["Column2"] = 1; 
rows.Add(row4); 

var sortedRows = rows.AsQueryable().OrderBy("Column1, Column2"); 
//System.Linq.Dynamic.ParseException : No property or field 'Column1' exists in type 'JObject' 

我怎麼能對屬性的動態數量JObject情況進行排序?

回答

1

您可以使用索引語法從System.Dynamic.Linq

var sortedRows = rows.AsQueryable().OrderBy(@"it[""Column1""], it[""Column2""]"); 

舊回答

使用System.Linq.Dynamic不能這樣做。要訪問JObject的物業,您需要撥打Property的方法。但是,System.Linq.Dynamic不允許這樣做。從文檔:

訪問類型方法和構造這些聲明的公共表達式語言限制調用。


表達式語言定義了以下原始類型

Object Boolean Char String SByte Byte Int16 UInt16 Int32 UInt32 Int64 UInt64 Decimal Single Double DateTime TimeSpan Guid

的原始類型對應於類似命名的類型在.NET Framework基礎類庫的系統命名空間。表達式語言還定義了一組訪問類型組成的原始類型和以下類型的從系統的名稱空間:

Math Convert

的可訪問類型是可以在表達式中明確引用的唯一類型,並且表達式語言中的方法調用僅限於在可訪問類型中聲明的方法。

+0

這是完美的!使我免於實施可怕的黑客攻擊。 – tponthieux 2014-10-03 00:20:17

1

你可以實現自己的IComparer這樣的:

public class MyJObjectComparer : IComparer<JObject> 
{ 
    public int Compare(JObject a, JObject b) 
    { 
     if ((a["Column1"] == b["Column1"]) && a["Column2"] == b["Column2"])) 
      return 0; 

     if ((a["Column1"] < b["Columnq"]) || ((a["Column1"] == b["Column1"]) && (a["Column2"] < b["Column2"]))) 
      return -1; 

     return 1; 
    } 
} 

而且使用這樣的:

var sortedRows = rows.AsQueryable().OrderBy(r => r, new MyJObjectComparer());