0

ASMXWebサービスからJSONにシリアル化されたLINQ結果を返そうとしています。私の知る限り、これはうまくいくはずなので、何かが足りないに違いありません。

    [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(query)行が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オブジェクトは、このCodeProjectプロジェクトからのものです。

4

1 に答える 1

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);
于 2012-09-13T17:00:50.617 に答える