Pregunta

Perdona cualquier ingenuidad, soy nuevo en el mundo de C#. Avíseme si he dejado de lado la información útil.

Estoy construyendo un SitEmapprovider personalizado para el portal de clientes para Dynamics CRM 2011. Primero inicializo una matriz:

public Adx_webpage[] WebPages;

que se pobla así:

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

Más tarde, trato de consultar páginas web [] como así:

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

Cuando ejecuto esto a través del depurador, obtengo una NullReferenceException que apunta a la condición de mi cláusula Where diciendo que p.adx_parentPageId.id es nulo, lo cual es cierto para la página de inicio del sitio. Lo que lleva a la pregunta:

¿Por qué esta consulta aumentaría la página de inicio como una p en mi consulta? ¿Qué soy malentendido?

¿Fue útil?

Solución

Tu primera línea

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

Le devolverá todas las páginas que no están ocultas en el mapa de su sitio. Pero esto también incluye su página de inicio que no tiene ID de padre. Entonces, cuando su segunda consulta enumera sobre esta colección, intentará acceder a esta propiedad que es nula y lanzar una excepción de referencia nula. Solo necesita atender esto en su consulta.

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

Otros consejos

El problema es el .toarray () en su primera consulta. Esta consulta de Linq está creando una consulta nativa para su proveedor de CRMContext:

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

El .toarray () está causando que la consulta LINQ se ejecute inmediatamente y devuelve una vieja y antigua matriz de objetos. La matriz no está conectada a su objeto CRMContext.

Sin embargo, esta consulta está usando Linq a los objetos para iterar sobre la matriz regresó en la primera llamada. No está generando una consulta nativa para su proveedor de CRMContext.

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

Es efectivamente lo mismo que usar un bucle foreach para iterar sobre cada elemento en la matriz, por lo que debe preocuparse por verificar los posibles valores nulos que fueron devueltos por su primera consulta.

No entiendo tu pregunta. Estás diciendo que la página de inicio es una página web y que no está oculta del mapa del sitio, entonces, ¿por qué no esperas que la página de inicio aparezca en tu consulta como un p?

De todos modos, simplemente puedes omitir cualquier cosa con p == null:

Adx_webpage[] childPages = (FROM p in WebPages
                            WHERE p.adx_parentpageid != null &&
                                  p.adx_parentpageid.Id == page.Id
                            SELECT p).ToArray();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top