CamlQuery query = new CamlQuery();
query.ViewXml = @"<View>"
+ "<Query>"
+ "<Where><Eq><FieldRef Name='Name' /><Value Type='Text'>"
+ fileName
+ "</Value>"
+ "</Eq>"
+ "</Where>"
+ "</Query>"
+ "</View>";
ListItemCollection item = list.GetItems(query);
clientContext.Load(item);
clientContext.ExecuteQuery();
このクエリでエラーが発生しました1つ以上のフィールドタイプが正しくインストールされていません。リスト設定ページに移動して、これらのフィールドを削除してください。
Name
の代わりに<Where><Eq><FieldRef Name='Title' /><Value Type='Text'>
を使用しても問題ありません。
どうしたの?リストに名前があります。
定義された列の名前を変更しても、内部名は更新されません。たとえば、カスタムリストを作成すると、デフォルトで「タイトル」列が表示されます。その列をたとえば「userId」に変更しても、その列の内部名は「Title」のままです。
これでエラーメッセージが修正されるかどうかはわかりませんが、次の方法でNameを使用できます。
名前(標準のドキュメントライブラリの場合)の内部名は"BaseName"です。
Powershellを使用して、リスト上のすべての列の内部名を見つけることができます。
$web = Get-SPWeb http://yoursiteurl
$web.lists["The List Name"].Fields | FL Title, InternalName
クエリの例:
$query.set_innerXML("<Where><Eq><FieldRef Name='BaseName'></FieldRef><Value Type='Text'>" + $ItemName + "</Value></Eq></Where>")
PowerShellの完全な例:
function Update-SPItem($proxy, $ItemName, $listName, $lastModified, $firstName, $lastName, $chID, $emplNumber, )
{
$doc = New-Object System.Xml.XmlDocument
$viewFields = $doc.CreateElement("ViewFields")
$viewFields.set_innerXML("<FieldRef Name='ID'></FieldRef>")
$queryOptions = $doc.CreateElement("QueryOptions")
$queryOptions.set_innerXML("<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns><DateInUtc>FALSE</DateInUtc><ViewAttributes Scope='RecursiveAll'/>")
$query = $doc.CreateElement("Query")
$query.set_innerXML("<Where><Eq><FieldRef Name='BaseName'></FieldRef><Value Type='Text'>" + $ItemName + "</Value></Eq></Where>")
$results = $proxy.GetListItems($listName, "", $query, $viewFields, "", $queryOptions, "")
$rowXml = $results.GetElementsByTagName("z:row")
$ItemID = $rowXml.Item(0).GetAttribute("ows_ID")
# Update the item
$batch = $doc.CreateElement("Batch")
$batch.SetAttribute("OnError", "Continue")
$batch.SetAttribute("ListVersion","1")
$batch.SetAttribute("ViewName", "")
$batch.InnerXml = "<Method ID='1' Cmd='Update'><Field Name='ID'>" + $ItemID +
"</Field><Field Name='ImageCreateDate'>" + $lastModified +
"</Field><Field Name='FirstName'>" + $firstName +
"</Field><Field Name='LastName'>" + $lastName +
"</Field><Field Name='CardHolderID'>" + $chID +
"</Field><Field Name='EmployeeNumber'>" + $emplNumber +
"</Field></Method>"
$result = $proxy.UpdateListItems($listName, $batch)
}
SharePoint 2010リスト設定ページでフィールドを作成する場合、フィールド名のスペースは、フィールドの内部名の_x0020_
のシーケンスになります。スペースに加えて、SharePointは他の非標準文字を同様の方法でエンコードします。したがって、リストのWebページに目的の名前が表示されますが、プログラムによるアクセスには、SharePointによって構築された内部名が必要です(内部名を指定できるようにする必要があります...)。
@MarekKembrowskiからOpへのコメントは、ブラウザを使用して内部名を取得する方法を示しています。
私はこれにあまりにも長い間苦労しました、そして答えは私の目の前にありました。私にとって、Marek Kembrowskiが元の質問に投稿したコメントはまさに私がする必要があったことでしたが、コメントだったのでそれをざっと見ました。この問題に伴う次の人は、上記のコメントを見逃すことはありません。
SharePointでは、列を作成するときに、フィールドを説明するための情報を入力する2つのテキストフィールド、列名と説明があります。
私を困らせたのは、SharePointサイトが列名[OrderID]と異なる説明[CON]で設定されたことです。
ここでは、最初に作成したOrderIDと、問題を解決した後に作成したOrderIDを使用して、Sharepointがどのように見えるかを確認できます。 。 。違いは、OrderID列名の1つがOrderIDと言うことです;)
元の列名を確認する唯一の方法は、上記のMarekのように、ライブラリ設定で列にカーソルを合わせることです。 。 。これにより、ブラウザの下部にリンクが表示されます。クリックして編集した場合。 。 。それも正しくありません。 。 。実際の列名についても何も表示されません。 。 .evenは、列名フィールドに説明名を表示します。 。 。 GGRRRRRRR !!!!!
とにかく、ここに私がデータを取得するために使用したコードがあります:
// Starting with ClientContext, the constructor requires a URL to the
// server running SharePoint.
ClientContext context = new ClientContext(siteUrl);
// The SharePoint web at the URL.
Web web = context.Web;
List docList = context.Web.Lists.GetByTitle("OrderDocuments");
CamlQuery query2 = new CamlQuery();
//This query will NOT work . . .CON is not a column in the sharepoint repository
//query2.ViewXml = "<View><Query><Where><Eq><FieldRef Name='CON' /><Value Type='Number'>4</Value></Eq></Where></Query></View>";
//This query WILL WORK. The actual Column name is OrderID in Sharepoint
query2.ViewXml = "<View><Query><Where><Eq><FieldRef Name='OrderID' /><Value Type='Number'>4</Value></Eq></Where></Query></View>";
ListItemCollection collListItem = docList.GetItems(query2);
context.Load(collListItem);
context.ExecuteQuery();
上記の正しい解決策については、Marekに+1してください。このページを最初に見つけたとき、私はそれを見ていたらよかったのに。
あなたが持っている問題は<FieldRef Name='Name' />
ではなく<Value Type='Text'>
だと思います。名前フィールドのタイプを確認すると、ファイルであることがわかります。誰かがクエリの方法を知っているなら、私も感謝します。今のところ、タイトルを使用しています。
兄弟要素の周りに最上位のタグがないクエリなど、不適切に構築されたクエリに対しても同じエラーメッセージが表示されます。
彼らは質問します:
<Where><Contains><FieldRef Name='...' /><Value Type='Text'>Foobar</Value></Contains></Where><OrderBy><FieldRef Name='Modified' /></OrderBy>
これと同じエラーメッセージが表示されますが、次のエラーメッセージは表示されません。
<View><Where><Contains><FieldRef Name='...' /><Value Type='Text'>Foobar</Value></Contains></Where><OrderBy><FieldRef Name='Modified' /></OrderBy></View>