2

私はC#の世界にまったく慣れていないので、素朴なことを許してください。役立つ情報を省略した場合はお知らせください。

Dynamics CRM 2011 のカスタマー ポータル用のカスタム SiteMapProvider を構築しています。まず、配列を初期化します。

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();

これをデバッガーで実行すると、WHERE 句で p.adx_parentpageid.Id が null であるという条件を指す NullReferenceException が返されます。これは、サイトのホームページに当てはまります。これは質問につながります:

このクエリでホーム ページが として表示されるのはなぜpですか? 私は何を誤解していますか?

4

3 に答える 3

4

あなたの最初の行

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

サイト マップで非表示になっていないすべてのページを返します。ただし、これには、親 ID を持たないホームページも含まれます。したがって、2 番目のクエリがこのコレクションを列挙すると、null であるこのプロパティにアクセスしようとし、null 参照例外をスローします。クエリでこれに対応する必要があります。

Adx_webpage[] childPages = 
(FROM p in WebPages WHERE 
p.adx_parentpageid.Id != null &&
p.adx_parentpageid.Id == page.Id SELECT p).ToArray();
于 2011-12-06T23:26:55.467 に答える
1

あなたの質問がわかりません。ホームページは Web ページであり、サイトマップから隠されているわけではないpと言っているのに、クエリでホームページが

とにかく、次のようにすれば何でもスキップできますp == null:

Adx_webpage[] childPages = (FROM p in WebPages
                            WHERE p.adx_parentpageid != null &&
                                  p.adx_parentpageid.Id == page.Id
                            SELECT p).ToArray();
于 2011-12-06T23:24:24.213 に答える
1

問題は、最初のクエリの .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 ループを使用して配列内の各要素を反復処理するのと事実上同じであるため、最初のクエリで返された可能性のある null 値をチェックする必要があります。

于 2011-12-06T23:16:30.513 に答える