Linqクエリの条項が失敗しているようです
-
29-10-2019 - |
質問
素朴なことを許してください、私は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();
}
後で、私はWebページ[]のように照会しようとします:
Adx_webpage[] childPages = (FROM p in WebPages WHERE p.adx_parentpageid.Id == page.Id SELECT p).ToArray();
これをデバッガーで実行すると、p.adx_parentpageid.idがサイトのホームページに当てはまるという条件の条件を指すnullreferenceExceptionを取得します。質問につながります:
なぜこのクエリはホームページを上げるのでしょうか p
私の質問で?私は何を誤解していますか?
解決
あなたの最初の行
WebPages = (FROM p in CrmContext.Adx_webpageSet WHERE p.Adx_HiddenFromSitemap != true SELECT p).ToArray();
サイトマップに隠されていないすべてのページを返します。しかし、これには親IDがないホームページも含まれています。したがって、2番目のクエリがこのコレクションに列挙されると、このプロパティにアクセスしようとします。クエリでこれに対応する必要があります。
Adx_webpage[] childPages =
(FROM p in WebPages WHERE
p.adx_parentpageid.Id != null &&
p.adx_parentpageid.Id == page.Id SELECT p).ToArray();
他のヒント
問題は、最初のクエリの.toarray()です。このLINQクエリは、CRMContextプロバイダーへのネイティブクエリを作成しています。
WebPages = (FROM p in CrmContext.Adx_webpageSet WHERE p.Adx_HiddenFromSitemap != true SELECT p).ToArray();
.toarray()は、LINQクエリを即座に実行し、オブジェクトのプレーンな配列を返します。配列はcrmcontextオブジェクトに接続されていません。
ただし、このクエリは使用されています オブジェクトへのlinq 最初の呼び出しで返された配列を繰り返します。 CRMContextプロバイダーにネイティブクエリを生成することはありません。
Adx_webpage[] childPages = (FROM p in WebPages WHERE p.adx_parentpageid.Id == page.Id SELECT p).ToArray());
foreachループを使用して配列内の各要素を反復することと事実上同じので、最初のクエリによって返される可能性のあるヌル値をチェックすることを心配する必要があります。
あなたの質問がわかりません。ホームページはウェブページであり、サイトマップから隠されていないので、なぜ そうしないでしょう ホームページがクエリに表示されることを期待しています p
?
とにかく、あなたは単に何でもスキップすることができます p == null
:
Adx_webpage[] childPages = (FROM p in WebPages
WHERE p.adx_parentpageid != null &&
p.adx_parentpageid.Id == page.Id
SELECT p).ToArray();