2012-09-13 21 views
0

我想從ASMX Webservice中返回序列化爲JSON的LINQ結果。據我所知這應該起作用,所以我必須錯過一些東西。ArgumentException返回的LINQ結果序列化爲JSON

[WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string GetCitiesForAffiliate(string aff) 
    { 
     XDocument centerXml = XDocument.Load(HttpContext.Current.Server.MapPath("~/App_Data/Centers.xml")); 
     var query = (from center in centerXml.Descendants("Center") 
        where center.Element("ServiceArea").Value == aff 
        orderby center.Element("City") ascending 
        select new { 
         City = center.Element("City") 
        }).Distinct(); 

     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     string json = serializer.Serialize(query); 

     return json; 
    } 

的serializer.Serialize(查詢)線引發ArgumentException:At least one object must implement IComparable.我想也許問題是,我是選擇一個匿名對象,但鍵入對象沒有做到這一點。我確定我只是想念一些愚蠢的東西?

有趣的是,以前的版本工作得很好:

[WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string GetCitiesForAffiliate(string aff) 
    { 
     TextFileReader reader1 = new TextFileReader(HttpContext.Current.Server.MapPath("~/App_Data/Centers.csv"), ","); 
     var query = (from cols in reader1 
        where cols[3].Equals(aff) 
        orderby cols[2] ascending 
        select new { City = cols[2] }).Distinct(); 

     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     string json = serializer.Serialize(query); 

     return json; 
    } 

的TextFileReader對象是從this CodeProject project

回答

1

看起來像懶惰的查詢執行得到你。直到最後一刻,LINQ纔會執行查詢。在這種情況下,在序列化線上。問題出在您的查詢中,而不是序列化程序。

這個問題看起來像是當你正在做一個訂單時,你正在找回一個XElement對象(它實際上並沒有實現IComparable)並且試圖比較它們。

我會先做你的選擇然後命令結果。

var query = (from center in centerXml.Descendants("Center") 
        where center.Element("ServiceArea").Value == aff 
        select new { 
         City = center.Element("City") //may need a .ToString() here to get the city name out 
        }).Distinct().OrderBy(x => x.City); 
+0

太棒了,工作。我確實需要ToString()進行比較。非常感謝! –