Кажется, что предложение WHERE в запросе LINQ не выполняется - PullRequest
2 голосов
/ 07 декабря 2011

Пожалуйста, прости любую наивность, я новичок в мире C #.Дайте мне знать, если я пропустил полезную информацию.

Я создаю собственный SiteMapProvider для клиентского портала для Dynamics CRM 2011. Сначала я инициализирую массив:

public Adx_webpage[] WebPages;

, которыйзаполняется следующим образом:

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

Позже я пытаюсь запросить WebPages [] следующим образом:

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

Когда я запускаю это через отладчик, я получаю исключение NullReferenceException, которое указывает наусловие в моем предложении WHERE о том, что p.adx_parentpageid.Id имеет значение null, что верно для домашней страницы сайта.Что приводит к вопросу:

Почему этот запрос должен показывать домашнюю страницу как p в моем запросе?Что я недопонимаю?

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Ваша первая строка

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

Вернет вам все страницы, которые не спрятаны на карте вашего сайта.Но это также относится и к вашей домашней странице, у которой нет родительского идентификатора.Поэтому, когда ваш второй запрос перечисляет эту коллекцию, он попытается получить доступ к этому свойству со значением NULL и сгенерировать исключение нулевой ссылки.Вам просто нужно учесть это в вашем запросе.

Adx_webpage[] childPages = 
(FROM p in WebPages WHERE 
p.adx_parentpageid.Id != null &&
p.adx_parentpageid.Id == page.Id SELECT p).ToArray();
1 голос
/ 07 декабря 2011

Я не понимаю вашего вопроса. Вы говорите, что домашняя страница является веб-страницей и НЕ скрыта от карты сайта, поэтому, почему не , вы ожидаете, что домашняя страница будет отображаться в вашем запросе как p?

В любом случае, вы можете просто пропустить что-нибудь с помощью p == null:

Adx_webpage[] childPages = (FROM p in WebPages
                            WHERE p.adx_parentpageid != null &&
                                  p.adx_parentpageid.Id == page.Id
                            SELECT p).ToArray();
1 голос
/ 07 декабря 2011

Проблема в .ToArray () при первом запросе.Этот запрос linq создает собственный запрос к вашему провайдеру CrmContext:

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

.ToArray () вызывает немедленный запуск запроса linq и возвращает простой старый массив объектов.Массив не присоединен к вашему объекту CrmContext.

Однако этот запрос использует Linq to Objects для перебора массива, возвращенного при первом вызове.Он не генерирует собственный запрос к вашему провайдеру CrmContext.

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

Это фактически то же самое, что использование цикла foreach для итерации по каждому элементу в массиве, поэтому вам нужно беспокоиться о проверке возможных нулевых значений, которыебыли возвращены вашим первым запросом.

...