ArgumentException返回LINQ结果序列化为JSON

时间:2012-09-13 16:50:07

标签: asp.net json asmx

我正在尝试从ASMX Webservice返回序列化为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对象来自this CodeProject project

1 个答案:

答案 0 :(得分: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);