15

次のようなリストがあります。

Movie          Year
-----          ----
Fight Club     1999
The Matrix     1999
Pulp Fiction   1994

CAML と SPQuery オブジェクトを使用して、Year 列から項目の個別のリストを取得し、ドロップダウン コントロールに入力する必要があります。

そこを検索することは、CAML クエリ内でこれを行う方法ではないようです。人々はどのようにしてこれを達成したのだろうか?

4

6 に答える 6

13

これを行う別の方法は、DataView.ToTable-Method を使用することです。最初のパラメーターは、リストを区別するものです。

            SPList movies = SPContext.Current.Web.Lists["Movies"];
            SPQuery query = new SPQuery();
            query.Query = "<OrderBy><FieldRef Name='Year' /></OrderBy>";

            DataTable tempTbl = movies.GetItems(query).GetDataTable();
            DataView v = new DataView(tempTbl);
            String[] columns = {"Year"};
            DataTable tbl = v.ToTable(true, columns);

その後、DataTable tbl を使用して続行できます。

于 2009-02-18T16:35:07.183 に答える
5

個別の結果をたとえばリピーターのデータソースにバインドし、ItemDataBoundイベントのe.Item.DataItemメソッドを介して実際のアイテムを保持する場合、DataTableの方法は機能しません。代わりに、データソースにバインドしたくない場合は、Linqを使用して個別の値を定義することもできます。

// Retrieve the list. NEVER use the Web.Lists["Movies"] option as in the other examples as this will enumerate every list in your SPWeb and may cause serious performance issues
var list = SPContext.Current.Web.Lists.TryGetList("Movies");

// Make sure the list was successfully retrieved
if(list == null) return;

// Retrieve all items in the list
var items = list.GetItems();

// Filter the items in the results to only retain distinct items in an 2D array
var distinctItems = (from SPListItem item in items select item["Year"]).Distinct().ToArray()

// Bind results to the repeater
Repeater.DataSource = distinctItems;
Repeater.DataBind();

個別のクエリに対するCAMLサポートがないため、このページで提供される各サンプルはSPListからすべてのアイテムを取得することに注意してください。これは小さなリストには問題ないかもしれませんが、何千ものリストアイテムを含むリストの場合、これはパフォーマンスを大幅に低下させます。残念ながら、これを達成するための最適化された方法はありません。

于 2010-12-29T10:25:15.357 に答える
2

CAML には DISTINCT がなく、次のようなものを使用してドロップダウンを試してみてください。

foreach (SPListItem listItem in listItems)
    {
        if ( null == ddlYear.Items.FindByText(listItem["Year"].ToString()) )
       {
                   ListItem ThisItem = new ListItem();
                   ThisItem.Text = listItem["Year"].ToString();
                   ThisItem.Value = listItem["Year"].ToString();
                   ddlYear.Items.Add(ThisItem);
        }
   }

ドロップダウンの名前が ddlYear であると仮定します。

于 2009-02-18T11:05:40.313 に答える
1

SPQuery から SPSiteDataQuery に切り替えることはできますか? 問題なくできるはずです。

その後、標準の ado.net の動作を使用できます。

SPSiteDataQuery query = new SPSiteDataQuery();
/// ... populate your query here. Make sure you add Year to the ViewFields.

DataTable table = SPContext.Current.Web.GetSiteData(query);

//create a new dataview for our table
DataView view = new DataView(table);

//and finally create a new datatable with unique values on the columns specified

DataTable tableUnique = view.ToTable(true, "Year");
于 2009-02-18T16:29:08.803 に答える
1

これがいかに不可能であったかについての投稿に次々と出くわした後、私はついに方法を見つけました。これは、SharePoint Online でテストされています。列のすべての一意の値を取得する関数を次に示します。リスト ID、ビュー ID、内部リスト名、およびコールバック関数を渡すだけです。

function getUniqueColumnValues(listid, viewid, column,  _callback){
var uniqueVals = [];
$.ajax({
    url: _spPageContextInfo.webAbsoluteUrl + "/_layouts/15/filter.aspx?ListId={" + listid + "}&FieldInternalName=" + column + "&ViewId={" + viewid + "}&FilterOnly=1&Filter=1",
    method: "GET",
    headers: { "Accept": "application/json; odata=verbose" }
    }).then(function(response) {
        $(response).find('OPTION').each(function(a,b){
            if ($(b)[0].value) {
                uniqueVals.push($(b)[0].value);
            }
        });
        _callback(true,uniqueVals);
},function(){
    _callback(false,"Error retrieving unique column values");
});

}

于 2017-08-30T20:17:38.930 に答える
0

私は今日、この問題を検討していましたが、考えられる最善の解決策は次のアルゴリズムを使用することです (申し訳ありませんが、現時点ではコードはありません)。

L is a list of known values (starts populated with the static Choice options when querying fill-in options, for example)
X is approximately the number of possible options

1. Create a query that excludes the items in L
1. Use the query to fetch X items from list (ordered as randomly as possible)
2. Add unique items to L
3. Repeat 1 - 3 until number of fetched items < X

これにより、返されるアイテムの総数が大幅に減少しますが、より多くのクエリを作成する必要があります。

X が完全に正確かどうかは問題ではありませんが、ランダム性は非常に重要です。基本的に、最初のクエリには最も一般的なオプションが含まれる可能性が高いため、2 番目のクエリではこれらのオプションが除外され、2 番目に一般的なオプションが含まれる可能性が高くなります。

最良の場合、最初のクエリにすべてのオプションが含まれ、2 番目のクエリは空になります。(2 回のクエリで合計 X 個のアイテムが取得されました)

最悪の場合 (例: 探しているオプションによってクエリが順序付けられ、各オプションに X 個以上の項目がある場合)、オプションと同じ数のクエリを作成します。合計で約 X * X 個のアイテムを返します。

于 2012-11-23T21:08:01.050 に答える