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

本文关键字:无效 操作 异常 JSON 字符串 传递 | 更新日期: 2023-09-27 17:59:11

这就是我所做的

        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之类的东西吗。请帮我消除这个错误?

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

我认为这更简单一些。此外,您可能需要一组具体的对象来序列化它们(而不是从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";
}

当我遇到同样的问题时,我快速研究了为什么在实体框架上会发生这种情况,并在Stack Overflow中找到了一个很好的答案。

阅读:这是bug吗?。。。得到了循环引用背后的原因。。。但是如何解决呢?

永远不应该将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";
    }
    

或者你可以在这里试试。但这将使模型不同于数据库。

LINQ to SQL和序列化