1

SPQuery の代わりに SPSiteDataQuery を使用するように次のコード スニペットを変換する方法を教えてください。サイト内のすべてのドキュメント ライブラリに対してクエリを実行する必要があります。

元のコードは次のとおりです。

using (SPWeb oWeb = new SPSite(properties.SiteId).OpenWeb(properties.RelativeWebUrl))
                {
                    SPList oList = oWeb.Lists["Quality Documents"];

                    //create query
                    SPQuery oQuery = new SPQuery();

                    //configure the query  //
                    oQuery.Query = "<Where><Eq><FieldRef Name='Document_x0020_Number' /><Value Type='Text'>" + docNum + "</Value></Eq></Where>";

                    //get the collection of items in the list
                    SPListItemCollection oItems = oList.GetItems(oQuery);

                    if (oItems.Count > 0)
                    {
                        newRnd = 0;
                    }
                    else
                    {
                        newRnd = 1;
                    }
                }

そして、ここに私が SPSiteDataQuery のために持っているものがありますが、それが正しいかどうか、および/またはコードが上記のコードと同じことを行うことを確認する方法がわかりません。

SPSiteDataQuery q = new SPSiteDataQuery();
q.Lists = "<Lists BaseType='1'/>";
q.Query = "<Where><Eq><FieldRef Name='Document_x0020_Number' /><Value Type='Text'>" + docNum + "</Value></Eq></Where>";
q.Webs = "<Webs Scope='SiteCollection' />";
q.ViewFields = "<FieldRef Name='Document_x0020_Number' />"';
q.RowLimit = 1;
4

1 に答える 1

3

SPQuerySPSiteDataQueryの主な違いは、クエリするリストの指定にあります。SPQuery とは異なり、SPSiteDataQuery では、リスト タイトルを指定して各サイトのクエリを絞り込むことはできません。Lists 要素しかないため、柔軟性が大幅に低下します。Vincent Rothwell は、すべての可能性についてここで説明しています。

この柔軟性のなさは、Lists 要素のコードで BaseType=1 を使用すると、すべてのドキュメント ライブラリからドキュメントが返されることを意味します。これを回避できる唯一の方法はQuality Documents、独自の ID 番号を持つ のカスタム リスト テンプレートを展開した場合です。その後、使用できるようになります<Lists ServerTemplate='XYZ' />(XYZ は、結果をそのタイプのリストに絞り込むための ID 番号です)。Quality Documentsそれ以外の場合は、ライブラリからのエントリのみが含まれるように、返される結果をフィルタリングする必要があります。

これとは別に、コードは同等に見えます。MOSS を実行している場合は、CrossListQueryInfoCrossListQueryCacheも参照してください。これらにより、SPSiteDataQuery スタイルのクエリをキャッシュできます。これに関する詳しい情報については、Jeff Dalton によるこの投稿を参照してください。

オブジェクトの破棄に関するコメントからの更新:

あなたのコードは SPSite オブジェクトをリークします - これには using 句も必要です。現在使用している using 行を次の行に置き換えます。

using (SPSite oSite = new SPSite(properties.SiteId))
using (SPWeb oWeb = oSite.OpenWeb(properties.RelativeWebUrl))
{
    // Your code
}

また、SPDisposeCheck の使用も簡単です。Visual Studio と統合するには、プロジェクトのビルド後のイベントに次の行を追加します。

"%ProgramFiles%\Microsoft\SharePoint Dispose Check\SPDisposeCheck.exe" $(TargetPath)

メモリ リークがあるとビルドが失敗するようになりました。それらの場所の詳細については、出力ウィンドウを確認してください。SPDisposeCheck は誤検知を報告することがありますが、これらは無視できることに注意してください (方法についてはドキュメントを参照してください)。

于 2009-07-14T16:56:17.877 に答える