2011-01-11 13 views
2

SPViewオブジェクトが多く、SPListItemオブジェクトが多数含まれています(ビューには多くのフィールドがあります)。SPViewオブジェクトを照会する方法

私はこれらのフィールドのいずれかに興味があります。 specialField

このビューとspecialFieldを指定すると、値がspecialFieldに含まれているかどうかを知りたいと思います。ここで

は私がやりたいことやっての方法です:

String specialField = "Special Field"; 
String specialValue = "value"; 
SPList list = SPContext.Current.Site.RootWeb.Lists["My List"]; 
SPView view = list.Views["My View"]; //This is the view I want to query 

SPQuery query = new SPQuery(); 
query.Query = view.Query; 
SPListItemCollection items = list.GetItems(query); 
foreach(SPListItem item in items) 
{ 
    var value = item[specialField]; 
    if(value != null) && (value.ToString() == specialValue) 
    { 
     //My value is found. This is what I was looking for. 
     //break out of the loop or return 
    } 
} 

//My value is not found. 

しかし、それぞれのListItemを反復することはほとんどの項目の何百ものがあるかもしれない、特にとして、最適なようです。このクエリは頻繁に実行されるので、効率的な方法を探しています。

EDIT 私の解決策をハードコードすることはできませんので、私はいつも、同じビューで作業されることはありません(それはリスト、ビューとspecialFieldを変更することができることを十分に汎用的である必要があります。

それが良いでしょうIEnumerableをオブジェクトにキャストするには、このような何かを言ってやるがいい?これは、より効率的である

list.GetItems(query).Cast<SPListItem>().Where(item => 
{ 
    return ((item[specialField] != null) && (item[specialField].ToString() == specialValue)); 
}).Count() > 0; 

または私は完全に間違った方向に向かっています

+0

なぜ句をクエリに追加しないでください。例http://msdn.microsoft.com/en-us/library/ms457534.aspx –

+0

私はクエリがどのように見えるかわからないので(ビュークエリです)。たとえば、OrderBy節がある場合、後でwhere節を追加することはできません( ... ... ...これは動作しません) –

+1

Where句のようになります...フィールド比較フィールド+ ORDER、CAMLはXMLと同じように動作しますが、複数のルートノードのように見えますが、SPViewオブジェクトに送信されるものはすべてタグでカプセル化されています。 GoogleのSharePoint CAMLの場合 – Colin

答えて

3
String specialField = "Special Field"; 
String specialValue = "value"; 
SPList list = SPContext.Current.Site.RootWeb.Lists["My List"]; 
SPView view = list.Views["My View"]; //This is the view I want to query 

SPQuery query = new SPQuery(); 
string tmp = view.Query; 
if(tmp.Contains("<Where>")) { 
    //wrap the existing where clause in your needed clause (it should be an And i think) 
    tmp = tmp.Insert(tmp.IndexOf("<Where>") + ("<Where>".Length), "<And><Eq><FieldRef Name='"+specialField+"'/><Value Type='Text'>"+specialValue+"</Value></Eq>"); 
    tmp = tmp.Insert(tmp.IndexOf("</Where>"), "</And>"); 
} else { 
    //add a where clause if one doesnt exist 
    tmp = "<Where><Eq><FieldRef Name='"+specialField+"'/><Value Type='Text'>"+specialValue+"</Value></Eq></Where>" + tmp; 
} 
query.Query = tmp; 
SPListItemCollection items = list.GetItems(query); 
if(item.Count > 0) { 
    //My value is found. This is what I was looking for. 
    //break out of the loop or return 
} else { 
    //My value is not found. 
} 
+0

テストされていませんが、私には+1が良いです。代わりに、CAMLをXmlDocumentに配置し、DOMを介して解析/変更することもできます。 – Ryan

+0

ええと、これは私が一度だけクエリをしなければならないので、行く方法です。私はこれを働かせて、受け入れられるとマークします。ご協力いただきありがとうございます! –

+0

これはとてもうまく動作します。最初のifの中で、最初の行はtmp = tmp.Insert(tmp)で始まる必要があります。IndexOf( "")+( "" .Length)...(正常に機能するために+1を削除しました)再度、感謝します! –

0

ますCamlでクエリを実行できます。 Thisは、Camlのクエリを理解するためのリンクです。thisは、クエリを自動的に構築するためのソフトウェアへのリンクです。

+0

私はすでにビューからSPListItemsを取得するためにCAMLクエリを行っている...そこにあるSPViewオブジェクトで直接CAMLクエリを実行する方法は?リストからSPListItemを最初に取得するためにCAMLを使用する必要がある場合は、CAMLを再度使用してそのセットを照会してください。効率的ではないかどうかはわかりません。私は、リストではなく、ベースセットとしてのビューを使って作業していることに留意して、例を挙げていますか? –