嗨,我是分享点和caml世界的新手,所以任何暗示我指向正确方向的提示都会有所帮助。
我已经拿起了Camlex https://camlex.codeplex.com/库来帮助我以一种很好的方式进行caml查询。
一切运作良好,直到我加入了InnerJoin
var caml =
Camlex.Query().
InnerJoin(x => x[CesaDocument.DocType_field].PrimaryList(CESAContext.Documents).ForeignList(CESAContext.DocumentType)).
Where(x => (string)x[CesaDocument.RiOID_field] == id).
Scope(ViewScope.RecursiveAll).ToCamlQuery();
最初代码最后是Join,我相信这是我得到源代码的问题,我设法在开始时获得了Join。
所以这给了我这个代码。
<View Scope="RecursiveAll">
<Joins> <Join Type="INNER" ListAlias="Document Types">
<Eq> <FieldRef List="Documents" Name="Doc_x0020_Type" RefType="Id" />
<FieldRef List="Document Types" Name="Id" />
</Eq> </Join> </Joins> <Query> <Where> <Eq>
<FieldRef Name="RiO_x0020_ID" />
<Value Type="Text">1</Value>
</Eq> </Where> </Query></View>
然而,这仍然是错误的 - 这个代码。
<nativehr>0x80070057</nativehr><nativestack></nativestack>
当我调用执行函数时。
List list = null;
ListItemCollection ListCollection = null;
list = this.Web.Lists.GetByTitle(List);
ListCollection = list.GetItems(query);
this.Load(ListCollection);
this.ExecuteQuery();
return ListCollection;
谷歌搜索似乎转向allowunsafeUpdates=true
,但我使用Micrsoft.Sharepoint.Client对象,我无法看到该属性,也无法更新。
我已将Caml查询粘贴到SP CAML Query Helper Online中,并按预期运行。
我这样做了吗? 我尝试了几种方法但无济于事。 我是否应该使用SPQuery对象,它是否可以与CSOM一起使用 - 如果是的话,那是什么库。
我应该在加入时使用Document_x0020_Types
吗?
编辑 - 尝试过,但没有工作。
EDIT2 只是觉得这样可行但不行。
<Joins>
<Join Type="INNER" ListAlias="Document_x0020_Types">
<Eq>
<FieldRef List="Documents" Name="Doc_x0020_Type" RefType="Id" />
<FieldRef List="Document_x0020_Types" Name="Id" />
</Eq>
</Join>
</Joins>
<View Scope="RecursiveAll">
<Query>
<Where>
<Eq>
<FieldRef Name="RiO_x0020_ID" />
<Value Type="Text">2</Value>
</Eq>
</Where>
</Query>
</View>
编辑3 所以现在我对Caml的格式有了更多了解,我可以修复我的camlex生成器。
var caml =
Camlex.Query()
.InnerJoin(x => x[CesaDocument.DocType_field].ForeignList(CESAContext.DocumentType))
.Where(x => (string)x[CesaDocument.RiOID_field] == id)
.Scope(ViewScope.RecursiveAll)
.ToCamlQuery();
只是丢掉主要位就行了!
答案 0 :(得分:1)
假设这是构建器为您生成的内容......
<View Scope="RecursiveAll">
<Joins>
<Join Type="INNER" ListAlias="Document Types">
<Eq>
<FieldRef List="Documents" Name="Doc_x0020_Type" RefType="Id" />
<FieldRef List="Document Types" Name="Id" />
</Eq>
</Join>
</Joins>
<Query>
<Where>
<Eq>
<FieldRef Name="RiO_x0020_ID" />
<Value Type="Text">1</Value>
</Eq>
</Where>
</Query>
</View>
问题:您不应该在联接的第一个List="Documents"
元素中使用属性<FieldRef>
。
说明: List
属性应该只采用在ListAlias
元素的前一个Join
属性中定义的别名。如果要从外部列表中加入其他列表,则连接中的主列表只需要List
属性,在这种情况下,别名将由前面的连接定义。如果省略List
属性,则联接的主列表将是执行查询的列表。
如果您的列表采用以下形状,则上面生成的CAML查询有效:
Doc_x0020_Type
。RiO_x0020_ID
如果其中任何一个为假(例如,RiO_x0020_ID
字段实际位于Document Types
列表上,而不是Documents
),则查询将失败。请注意,您不需要指定您要加入的外部列表的实际名称,因为该映射与现有的查找字段关系相似。
进一步阅读:有关如何在CAML中使用连接的更多信息(以及投影/投影字段的相关概念,如果您想根据中的值进行任何过滤,则必须使用加入外国列表)您可以在此处参考Microsoft的文档:https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx