ICollection循环参考

时间:2015-04-26 16:49:43

标签: c# asp.net-mvc linq asp.net-mvc-3

我有像这样的LINQ查询

var Data = from a in db.Medlem
                   where a.Person.PersonId.Equals(BrukerCv.Person.PersonId)
                   select new
                   {
                       a.Prosjekt.ProsjektId,
                       a.Prosjekt.Navn,
                       a.Prosjekt.Kunde,
                       a.Prosjekt.TekniskProfil,
                       a.MedlemId,
                       a.Rolle,
                       a.Start,
                       a.Slutt
                   };

我希望像json一样返回它,所以我用这个

return Json(Data, JsonRequestBehavior.AllowGet);

但我遇到的问题是我收到了错误

  

在序列化类型为' System.Data.Entity.DynamicProxies.CVVersjon_4F0DBDC27A40F2FDF90760ABFDE49CBE0B75F52902B1C5F1E466393543AC44E8'的对象时检测到循环引用。

我认为这是因为a.Prosjekt.TekniskProfilICollection

那么我怎样才能获得ICollection?

就像,我不想要ICollection TekniskProfil中的所有值,只需要某些值

TekniskProfil表格中的引用回到Prosjekt表格,这是我不想要的猜测

2 个答案:

答案 0 :(得分:2)

您只能选择投影数据时所需的值:

select new
{
    ProsjektId = a.Prosjekt.ProsjektId,
    Navn = a.Prosjekt.Navn,
    Kunde = a.Prosjekt.Kunde,
    TekniskProfil = a.Prosjekt.TekniskProfil.Select(x => new
    {
        // Select only the properties you need here and avoid
        // circular references - exclude all properties that contain
        // circular object graphs
        Foo = x.Foo,
        Bar = x.Bar,
    }),
    ...
};

答案 1 :(得分:0)

问题的根本原因很可能是a.Prosjekt.TekniskProfil包含对象,其中该对象包含对medlem的引用。 在序列化过程中,然后检测到medlem实际上已经被序列化,因此你得到了错误。

Darin提供的投影解决方案解决了这个问题,但我认为很高兴知道你为什么会遇到这个错误。

我不会说你的语言,所以很难推断出发生了什么。但每当我遇到这个错误时,就是在序列化过程中,它会以某种方式找回回到首先被序列化的对象。如果序列化在哪里继续,那将是一个无限循环。