传递JSON字符串时无效的操作异常

时间:2011-06-16 04:03:02

标签: c# jquery json

这就是我所做的

        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字符串时,我收到循环引用错误。 Serialize步骤发生错误。所以,我想我可能会收到一个错误,因为它是一个无效的对象或其他东西。我是否需要使用像Iqueryable之类的东西。请帮我摆脱这个错误?

2 个答案:

答案 0 :(得分:1)

我认为这更直截了当。此外,您可能需要一组具体的对象来序列化它们(而不是您从LINQ查询中获得的IQueryable<T>IEnumerable<T>,因此我投入了.ToList()得到List<T>,其中TNCDCPoints集合中的任何类型。这是完全未经测试的,只是你知道。

为了避免您提到的循环引用,您可以使用我添加到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";
}

答案 1 :(得分:0)

当我遇到同样的问题时,我快速研究了为什么会在Entity Framework上发生这种情况,并在Stack Overflow本身遇到了一个很好的答案。

阅读本文:Is this bug ?...got reason behind circular reference ... how to solve but?

  

你永远不应该将LINQ序列化为   SQL(或实体框架)类。   即使微软放置了   [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";
    }
    
  3. 或者你可以尝试一下这里的东西。但这将使该模型与数据库不同。

    LINQ to SQL and Serialization