Question

Veuillez pardonner toute naïveté, je suis tout nouveau dans le monde du C#.Faites-moi savoir si j'ai omis des informations utiles.

Je crée un SiteMapProvider personnalisé pour le portail client de Dynamics CRM 2011.J'initialise d'abord un tableau :

public Adx_webpage[] WebPages;

qui se remplit ainsi :

public MyProvider()
{
    WebPages = (FROM p in CrmContext.Adx_webpageSet WHERE p.Adx_HiddenFromSitemap != true SELECT p).ToArray();
}

Plus tard, j'essaie d'interroger WebPages[] comme ceci :

Adx_webpage[] childPages = (FROM p in WebPages WHERE p.adx_parentpageid.Id == page.Id SELECT p).ToArray();

Lorsque j'exécute cela via le débogueur, j'obtiens une NullReferenceException qui pointe vers la condition de ma clause WHERE indiquant que p.adx_parentpageid.Id est nul, ce qui est vrai pour la page d'accueil du site.Ce qui amène à la question :

Pourquoi cette requête afficherait-elle la page d'accueil en tant que p dans ma requête ?Qu'est-ce que j'ai mal compris ?

Était-ce utile?

La solution

Votre première ligne

    WebPages = (FROM p in CrmContext.Adx_webpageSet WHERE p.Adx_HiddenFromSitemap != true SELECT p).ToArray();

Vous renverra toutes les pages qui ne sont pas masquées dans le plan de votre site.Mais cela inclut également votre page d'accueil qui n'a pas d'identifiant parent.Ainsi, lorsque votre deuxième requête énumère cette collection, elle tentera d'accéder à cette propriété qui est nulle et lancera une exception de référence nulle.Il vous suffit d'en tenir compte dans votre requête.

Adx_webpage[] childPages = 
(FROM p in WebPages WHERE 
p.adx_parentpageid.Id != null &&
p.adx_parentpageid.Id == page.Id SELECT p).ToArray();

Autres conseils

Le problème est le .ToArray() lors de votre première requête.Cette requête Linq crée une requête native vers votre fournisseur CrmContext :

WebPages = (FROM p in CrmContext.Adx_webpageSet WHERE p.Adx_HiddenFromSitemap != true SELECT p).ToArray();  

Le .ToArray() provoque l'exécution immédiate de la requête Linq et renvoie un ancien tableau d'objets.Le tableau n'est pas attaché à votre objet CrmContext.

Cependant, cette requête utilise Linq aux objets pour parcourir le tableau renvoyé lors du premier appel.Il ne génère pas de requête native vers votre fournisseur CrmContext.

Adx_webpage[] childPages = (FROM p in WebPages WHERE p.adx_parentpageid.Id == page.Id SELECT p).ToArray());    

C'est en fait la même chose que d'utiliser une boucle foreach pour parcourir chaque élément du tableau, vous devez donc vous soucier de vérifier les éventuelles valeurs nulles renvoyées par votre première requête.

Je ne comprends pas votre question.Vous dites que la page d'accueil est une page Web et qu'elle n'est PAS masquée du plan du site, alors pourquoi ne le ferais-je pas vous vous attendez à ce que la page d'accueil apparaisse dans votre requête sous la forme d'un p?

Quoi qu'il en soit, vous pouvez simplement sauter n'importe quoi avec p == null:

Adx_webpage[] childPages = (FROM p in WebPages
                            WHERE p.adx_parentpageid != null &&
                                  p.adx_parentpageid.Id == page.Id
                            SELECT p).ToArray();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top