C# Sharepoint Camlex Caml连接错误
嗨,我是sharepoint和caml的新手,所以任何提示都会给我指明正确的方向 我选择了Camlex库来帮助我以一种好的方式进行caml查询 在我加入InnerJoin之前,一切都很顺利C# Sharepoint Camlex Caml连接错误,c#,asp.net-mvc,sharepoint-2010,caml,csom,C#,Asp.net Mvc,Sharepoint 2010,Caml,Csom,嗨,我是sharepoint和caml的新手,所以任何提示都会给我指明正确的方向 我选择了Camlex库来帮助我以一种好的方式进行caml查询 在我加入InnerJoin之前,一切都很顺利 var caml = Camlex.Query(). InnerJoin(x => x[CesaDocument.DocType_field].PrimaryList(CESAContext.Documents).ForeignList(C
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();
起初,代码在结尾处带有连接——我认为这是问题所在,我得到了源代码,并在开始时设法获得了连接
这就给了我这个密码
<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>
谷歌搜索似乎会使属性变为allowunsafeUpdates=true
,但我使用的是Micrsoft.Sharepoint.Client对象,我看不到该属性,也没有更新。
我已将Caml查询粘贴到SP Caml query Helper Online中,并按预期运行
我这样做对吗?
我试过几种方法,但都没有用。
我是否应该使用SPQuery对象,它是否可以与CSOM一起使用?如果是,它在哪个库中
我应该在加入时使用文档类型吗?
编辑-尝试过,但没有成功
编辑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>
只需去掉主位就成功了 假设这是构建器为您生成的内容
<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>
1.
问题:您不应该在join的第一个
元素中使用属性List=“Documents”
解释:假设列表
属性只接受在连接
元素的前面列表别名
属性中定义的别名。如果要从外部列表中加入其他列表,则联接中的主列表只需要一个list
属性,在这种情况下,别名将由前面的联接定义。如果省略了List
属性,则联接的主列表将是执行查询所针对的列表
如果列表采用以下形状,则上述生成的CAML查询在其他方面有效:
您正在使用此CAML查询的列表(我猜它是命名文档)有一个内部名称为Doc\u x0020\u Type
的查找字段
同一文档列表有一个文本字段,其内部名称为RiO\u x0020\u ID
如果其中任何一个为假(例如,如果您的RiO\u x0020\u ID
字段实际上在文档类型列表中,而不是在文档中),则查询将失败。请注意,不需要指定要加入的外部列表的实际名称,因为映射与现有的查找字段关系平行
进一步阅读:了解有关如何在CAML中使用联接的更多信息(以及投影/投影字段的相关概念,如果要根据联接的外部列表中的值进行任何筛选,则必须使用该概念)您可以在此处参阅Microsoft文档:RiOID是文档列表中的字段还是文档类型列表中的字段?RiOID在“文档”列表中。它不在类型列表中。谢谢你的帮助,是的,删除列表=“文档”成功了。我想我需要看看Camlex库和我对它的使用。但是谢谢你的帮助。是的,修复了我的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>