传递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之类的东西吗。请帮我消除这个错误?
我认为这更简单一些。此外,您可能需要一组具体的对象来序列化它们(而不是从LINQ查询中获得的IQueryable<T>
或IEnumerable<T>
,所以我添加了一个.ToList()
来获得List<T>
,其中T
是NCDCPoints
集合中的任何类型
为了避免您提到的循环引用,您可以使用我添加到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]和其他属性这些类,它们不应该序列化。
相反,设计一组类正确匹配您想要的内容已序列化。
请尝试以下步骤。
-
创建一个名为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; } }
-
现在这样修改您的代码。
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和序列化