2012-09-13 3 views
0

ASMX 웹 서비스에서 JSON에 직렬화 된 LINQ 결과를 반환하려고합니다. 내가 아는 한 이것이 작동해야하므로 뭔가를 놓치고 있어야합니다.LINQ 결과를 JSON에 직렬화하여 반환하는 ArgumentException

[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는 마지막 순간까지 쿼리를 실행하지 않습니다. 이 경우 직렬화 라인에 있습니다. 쿼리는 serializer가 아니라 문제입니다.

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()이 필요했습니다. 고마워요! –

관련 문제