2011-05-25 143 views
1

我這樣做:我可以獲得JavaScriptSerializer以分層序列化LINQ結果嗎?

var data = from a in attributes 
      from i in attributeItems.Where(x=>x.DocClassAttributeFieldId == a.Id) 
      .DefaultIfEmpty(new DocClassAttributeFieldItem()) 
       select new 
       { 
        Id = a.Id, 
        LabelText = a.LabelText, 
        Items = i 
       }; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
TextBox1.Text = serializer.Serialize(data); 

結果是這樣的:

[{ 
    "Id": 1, 
    "LabelText": "Unit On-Line Status:", 
    "Items": { 
     "Id": 1, 
     "DocClassAttributeFieldId": 1, 
     "LabelText": "Online", 
     "ValueText": "Online", 
     "Ordering": 1 
    } 
}, 
{ 
    "Id": 1, 
    "LabelText": "Unit On-Line Status:", 
    "Items": { 
     "Id": 2, 
     "DocClassAttributeFieldId": 1, 
     "LabelText": "Offline", 
     "ValueText": "Offline", 
     "Ordering": 2 
    }, 
}] 

我想有這樣的結果:

[{  
    "Id": 1,  
    "LabelText": "Unit On-Line Status:",  
    "Items": [{  
     "Id": 1,  
     "DocClassAttributeFieldId": 1,  
     "LabelText": "Online",  
     "ValueText": "Online",  
     "Ordering": 1  
    },{  
     "Id": 2,  
     "DocClassAttributeFieldId": 1,  
     "LabelText": "Offline",  
     "ValueText": "Offline",  
     "Ordering": 2  
    }]  
}] 

可以這樣輕鬆完成用JavaScriptSerializer還是可以重寫LINQ語句來產生這個?

更新:由於像這樣的一些帖子...

http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

http://encosia.com/using-complex-types-to-make-calling-services-less-complex/

我不打算使用JavaScriptSerializer,ASP.Net做這一切對我來說:

[WebMethod] 
public static object GetDocClass(int docClassId) 
{ 
    var data = from a in attributes      
     select new 
     { 
      Id = a.Id, 
      LabelText = a.LabelText, 
      Items = attributeItems.Where(x=>x.DocClassAttributeFieldId == a.Id)      
     };   
    return data; 
} 

回答

0

有可能是一個更好的辦法,但尼克斯的回答幫我想出了這一點:

var data = from a in attributes      
      select new 
      { 
       Id = a.Id, 
       LabelText = a.LabelText, 
       Items = attributeItems.Where(x=>x.DocClassAttributeFieldId == a.Id)      
      }; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
TextBox1.Text = serializer.Serialize(data); 
1

您可以做到這一點,但您需要使用組來填充項目。

var data = 
     from a in attributes 
     from i in attributeItems.Where(x=>x.DocClassAttributeFieldId == a.Id) 
     group a by a.Id, a.LabelText into myGroup 
     .DefaultIfEmpty(new DocClassAttributeFieldItem()) 
      select new 
      { 
       Id = a.Id, 
       LabelText = a.LabelText, 
       Items = myGroup.ToList() 
      }; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
TextBox1.Text = serializer.Serialize(data); 

這是從臀部開槍,所以讓我知道如果它不適合你。

相關問題