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 查询有效:

  1. 您使用此 CAML 查询的列表(我猜它被命名为文档)有一个内部名称为 Doc_x0020_Type 的查找字段。
  2. 同一个文档列表有一个内部名称为 RiO_x0020_ID
  3. 的文本字段

如果其中任何一个为假(例如,如果您的 RiO_x0020_ID 字段实际上在 Document Types 列表中,而不是在 Documents 中),则查询将失败。请注意,您不需要 指定您要加入的外部列表的实际名称,因为映射与现有的查找字段关系平行。

进一步阅读:有关如何在 CAML 中使用联接的更多信息(以及 Projections/Projected 字段的相关概念,如果您想执行任何操作,这是必需的根据加入的外国列表中的值过滤)你可以在这里参考微软的文档:https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx