这就是我所做的
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之类的东西。请帮我摆脱这个错误?
答案 0 :(得分:1)
我认为这更直截了当。此外,您可能需要一组具体的对象来序列化它们(而不是您从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";
}
答案 1 :(得分:0)
当我遇到同样的问题时,我快速研究了为什么会在Entity Framework上发生这种情况,并在Stack Overflow本身遇到了一个很好的答案。
阅读本文:Is this bug ?...got reason behind circular reference ... how to solve but?
你永远不应该将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";
}
或者你可以尝试一下这里的东西。但这将使该模型与数据库不同。