Domanda

Per favore perdona qualsiasi ingenuità, sono nuovo di zecca nel mondo di C#. Fammi sapere se ho lasciato fuori informazioni utili.

Sto costruendo un SiteMapprovider personalizzato per il portale dei clienti per Dynamics CRM 2011. Prima inizializza un array:

public Adx_webpage[] WebPages;

che viene popolato così:

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

Più tardi, provo a interrogare pagine Web [] in questo modo:

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

Quando eseguo questo tramite il debugger, ottengo una Exception NullReference che indica la condizione nella mia clausola in cui la clausola dicendo che p.adx_parentpageid.id è null, il che è vero per la home page del sito. Il che porta alla domanda:

Perché questa query dovrebbe alzare la home page come a p Nella mia domanda? Cosa sto fraintendendo?

È stato utile?

Soluzione

La tua prima riga

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

Ti restituirà tutte le pagine che non sono nascoste nella mappa del tuo sito. Ma questo include anche la tua home page che non ha ID genitore. Quindi, quando la seconda query elenca su questa raccolta, tenterà di accedere a questa proprietà che è nulla e lancia un'eccezione di riferimento nulla. Devi solo soddisfare questo nella tua domanda.

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

Altri suggerimenti

Il problema è il .toarray () sulla tua prima domanda. Questa query LINQ sta creando una query nativa per il tuo provider CRMContext:

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

Il .toarray () sta facendo funzionare immediatamente la query LINQ e restituisce una semplice gamma di oggetti. L'array non è allegato all'oggetto CRMContext.

Tuttavia, questa domanda sta usando Linq agli oggetti Per iterare sull'array è tornato nella prima chiamata. Non sta generando una query nativa al tuo provider CRMContext.

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

È effettivamente lo stesso dell'utilizzo di un ciclo foreach per iterare su ciascun elemento nell'array, quindi devi preoccuparti di verificare i possibili valori nulli che sono stati restituiti dalla prima query.

Non capisco la tua domanda. Stai dicendo che la homepage è una pagina web e non è nascosta dalla sitemap, quindi perché non lo farebbe Ti aspetti che la homepage si presenti nella tua domanda come p?

Comunque, puoi semplicemente saltare qualsiasi cosa p == null:

Adx_webpage[] childPages = (FROM p in WebPages
                            WHERE p.adx_parentpageid != null &&
                                  p.adx_parentpageid.Id == page.Id
                            SELECT p).ToArray();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top