Недопустимая исключительная операция при передаче строки JSON - PullRequest
0 голосов
/ 16 июня 2011

Это то, что я сделал

        bool query = ( from n in CDC.NCDCPoints
                where n.EVENT_TYPE_ID == et
                where n.BeginDate == b
                where n.EndDate == e
                select n).Count()>0;

       var dupli = (from n in CDC.NCDCPoints
                     where n.EVENT_TYPE_ID == et
                     where n.BeginDate == b
                     where n.EndDate == e
                     select n);
        if (query)
        {
         return new JavaScriptSerializer().Serialize(dupli);
        }
        else
        {
            return "No duplicate";
        }

Когда я пытаюсь преобразовать ее в строку JSON, я получаю ошибку циклической ссылки. Ошибка возникает на этапе сериализации. Итак, я думаю, что, вероятно, я получаю ошибку, потому что это недопустимый объект или что-то. Нужно ли использовать что-то вроде Iqueryable или что-то. Пожалуйста, помогите мне избавиться от этой ошибки?

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Я думаю, что это немного проще.Кроме того, вам может понадобиться конкретный набор объектов для их сериализации (вместо IQueryable<T> или IEnumerable<T>, который вы получаете из запроса LINQ, поэтому я добавил .ToList(), чтобы получить List<T>где T - это любой тип в вашей коллекции * 1006. * Это полностью не проверено, просто чтобы вы знали.

Чтобы избежать упомянутой вами циклической ссылки, вы можете использовать технику, которую я добавил в LINQ.запрос:

var query = (from n in CDC.NCDCPoints
             where n.EVENT_TYPE_ID == et && n.BeginDate == b && n.EndDate == e
             select new 
             {
                 EventTypeId = n.EVENT_TYPE_ID,
                 BeginDate = n.BeginDate,
                 EndDate = n.EndDate,
                 ... // add the other properties you need on the client side
             });

if (query.Any())
{
    return new JavaScriptSerializer().Serialize(query.ToList());
}
else
{
    return "No duplicate";
}
0 голосов
/ 16 июня 2011

Когда я столкнулся с той же проблемой, я быстро выяснил, почему это происходит в Entity Framework, и наткнулся на чудесный ответ в самом Stack Overflow.

Прочитайте это: Это ошибка? ... есть причина за круговой ссылкой ... как решить, но?

Вы никогда не должны сериализовать LINQ для Классы SQL (или Entity Framework). Хотя Microsoft разместила [DataContract] и другие атрибуты на эти классы, они не должны быть сериализованная.

Вместо этого разработайте набор классов, которые правильно соответствует тому, что вы хотите Сериализовано.

Попробуйте эти шаги.

  1. Создать фиктивный класс с именем NCDCPointsMock

    public class NCDCPointsMock
    {
        public DateTime? BeginDate { get; set; }
        public DateTime? EndDate { get; set; }
        public int EVENT_TYPE_ID { get; set; }
        // add another dfields you might have in the original NCDCPoints class
        //example        
        //public int ID { get; set; }
    }
    
  2. Теперь измените ваш код следующим образом.

    var query = CDC.NCDCPoints
        .Select(n => n.EVENT_TYPE_ID == et 
            && n.BeginDate == b 
            && n.EndDate == e );
    if (query.Any())
    {
        var points = query.ToList();]
        List<NCDCPointsMock> duplicates = new List<NCDCPointsMock>();
        foreach(var point in points)
        {
            NCDCPointsMock dupli = new NCDCPointsMock();
            dupli.ID = point.ID;
            dupli.BeginDate = point.BeginDate;
            dupli.EndDate = point.EndDate;
            dupli.EVENT_TYPE_ID = point.EVENT_TYPE_ID;
            duplicates.Add(dupli);
        }
        return new JavaScriptSerializer().Serialize(dupli);
    }
    else
    {
        return "No duplicate";
    }
    

Или вы можете попробовать что-нибудь отсюда. Но это сделает модель отличной от базы данных.

LINQ to SQL и сериализация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...