C# Sharepoint Camlex Caml连接错误

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

嗨,我是sharepoint和caml的新手,所以任何提示都会给我指明正确的方向

我选择了Camlex库来帮助我以一种好的方式进行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();
起初,代码在结尾处带有连接——我认为这是问题所在,我得到了源代码,并在开始时设法获得了连接

这就给了我这个密码

<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>