Sharepoint Camlex Caml 加入错误
Sharepoint Camlex Caml Join error
嗨,我是 Sharepoint 和 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
吗?
编辑 - 试过了但没用。
编辑2
只是认为这会起作用,但没有。
<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();
只需删除主位就可以了!
假设这是生成器为您生成的...
<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>
问题: 您不应该在联接的第一个 <FieldRef>
元素中需要属性 List="Documents"
。
解释: List
属性应该只采用在 Join
的前一个 ListAlias
属性中定义的别名元素。如果您要从外部列表中加入其他列表,则联接中的主列表只需要一个 List
属性,在这种情况下,别名将由前面的联接定义。如果省略 List
属性,则连接的主列表将是对其执行查询的列表。
如果您的列表具有以下形状,则上面生成的 CAML 查询有效:
- 您使用此 CAML 查询的列表(我猜它被命名为文档)有一个内部名称为
Doc_x0020_Type
的查找字段。
- 同一个文档列表有一个内部名称为
RiO_x0020_ID
的文本字段
如果其中任何一个为假(例如,如果您的 RiO_x0020_ID
字段实际上在 Document Types
列表中,而不是在 Documents
中),则查询将失败。请注意,您不需要 指定您要加入的外部列表的实际名称,因为映射与现有的查找字段关系平行。
进一步阅读:有关如何在 CAML 中使用联接的更多信息(以及 Projections/Projected 字段的相关概念,如果您想执行任何操作,这是必需的根据加入的外国列表中的值过滤)你可以在这里参考微软的文档:https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx
嗨,我是 Sharepoint 和 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
吗?
编辑 - 试过了但没用。
编辑2 只是认为这会起作用,但没有。
<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();
只需删除主位就可以了!
假设这是生成器为您生成的...
<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>
问题: 您不应该在联接的第一个 <FieldRef>
元素中需要属性 List="Documents"
。
解释: List
属性应该只采用在 Join
的前一个 ListAlias
属性中定义的别名元素。如果您要从外部列表中加入其他列表,则联接中的主列表只需要一个 List
属性,在这种情况下,别名将由前面的联接定义。如果省略 List
属性,则连接的主列表将是对其执行查询的列表。
如果您的列表具有以下形状,则上面生成的 CAML 查询有效:
- 您使用此 CAML 查询的列表(我猜它被命名为文档)有一个内部名称为
Doc_x0020_Type
的查找字段。 - 同一个文档列表有一个内部名称为
RiO_x0020_ID
的文本字段
如果其中任何一个为假(例如,如果您的 RiO_x0020_ID
字段实际上在 Document Types
列表中,而不是在 Documents
中),则查询将失败。请注意,您不需要 指定您要加入的外部列表的实际名称,因为映射与现有的查找字段关系平行。
进一步阅读:有关如何在 CAML 中使用联接的更多信息(以及 Projections/Projected 字段的相关概念,如果您想执行任何操作,这是必需的根据加入的外国列表中的值过滤)你可以在这里参考微软的文档:https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx