2011-06-16 3 views
0

C'est ce que je l'ai faitexception d'opération non valide lors du passage chaîne 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"; 
     } 

Lorsque je tente de le convertir en une chaîne JSON, je reçois une erreur de référence circulaire. L'erreur se produit à l'étape Serialize. Donc, je pense probablement que je reçois une erreur parce que c'est un objet invalide ou quelque chose. Ai-je besoin d'utiliser quelque chose comme Iqueryable ou quelque chose. S'il vous plaît aidez-moi à se débarrasser de cette erreur?

+0

hors sujet: utilisez '.Tout()' 'l'extension au lieu de Count()> 0' –

+0

une raison quelconque vous avez plusieurs' where's au lieu d'utiliser '' && ou 'définir Dupli 'en dehors de la portée dans laquelle vous l'utilisez? –

+0

dupli peut être défini à l'intérieur si .... Laissez-moi essayer celui-là .. –

Répondre

1

Je pense que c'est un peu plus simple. En outre, vous pourriez avoir besoin d'un ensemble concret d'objets afin de les sérialiser (au lieu d'un IQueryable<T> ou IEnumerable<T> que vous obtenez de la requête LINQ, donc j'ai jeté un .ToList() pour obtenir un List<T>, où T est quel type se trouve dans . votre collection NCDCPoints Ceci est tout à fait non testé, si vous le savez

pour éviter la référence circulaire que vous avez mentionné, vous pouvez utiliser la technique que j'ajouté à la requête 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"; 
} 
+0

@Cory: Je reçois toujours la même erreur de référence circulaire (qui est une exception d'opération invalide de type). –

+0

'JavascriptSerializer' utilise la réflexion pour sérialiser votre liste, mais vous devez avoir une propriété qui pointe vers les' CDC.NCDCPoints 'liste.Une collection ne peut pas être sérialisée si elle comporte des références circulaires. –

+0

@Carlson: Oh ... Alors pouvez-vous me dire une autre façon de faire cela? –

0

Quand je courais à travers la même problème, j'ai fait une recherche rapide sur les raisons pour lesquelles cela se produit sur Entity Framework et j'ai trouvé une réponse merveilleuse à St Ack Overflow lui-même.

Lire ceci: Is this bug ?...got reason behind circular reference ... how to solve but?

Vous ne devriez jamais sérialisation LINQ to SQL les classes (ou Entity Framework). Même si Microsoft a placé [DataContract] et d'autres attributs sur ces classes, elles ne doivent pas être sérialisées. Au lieu de cela, créez un ensemble de classes qui correspond correctement à ce que vous voulez ont sérialisé.

Procédez comme suit.

  1. Créer une classe fantaisie appelée 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. modifier maintenant votre code comme celui-ci.

    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"; 
    } 
    

Ou vous pouvez essayer quelque chose d'ici. Mais cela rendra le modèle différent de la base de données.

LINQ to SQL and Serialization

+0

hey..Mon problème est que j'ai tellement de champs dans les NCDCPoints. Et ils sont dynamiques. Donc, en dehors de la sérialisation, ai-je un autre moyen de le faire? –

+0

@nishanth yeddula: en fait, je n'aurais pas posté ceci si j'avais vu la réponse de Cory avant la main. approche légèrement différente mais en fait la même chose. – naveen

+0

K. Aucun problème ... BTW merci pour votre solution. –

Questions connexes