Sharepoint Camlex Caml加入错误

时间:2016-11-18 11:21:15

标签: c# asp.net-mvc sharepoint-2010 caml csom

嗨,我是分享点和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();

只是丢掉主要位就行了!

1 个答案:

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

  1. 您使用此CAML查询的列表(以及我猜测的名为Documents的列表)的查询字段的内部名称为Doc_x0020_Type
  2. 同一个文档列表的文本字段的内部名称为RiO_x0020_ID
  3. 如果其中任何一个为假(例如,RiO_x0020_ID字段实际位于Document Types列表上,而不是Documents),则查询将失败。请注意,您需要指定您要加入的外部列表的实际名称,因为该映射与现有的查找字段关系相似。

    进一步阅读:有关如何在CAML中使用连接的更多信息(以及投影/投影字段的相关概念,如果您想根据中的值进行任何过滤,则必须使用加入外国列表)您可以在此处参考Microsoft的文档:https://msdn.microsoft.com/en-us/library/office/ee539975(v=office.14).aspx