Sharepoint 2013 .NET CSOM CamlQuery加入

时间:2013-09-18 14:54:54

标签: .net sharepoint join caml csom

我无法在我的.net csom应用程序中使用join创建一个有效的查询。我正在使用这篇文章:

http://msdn.microsoft.com/en-us/library/ff798388.aspx

这是我的代码:

 ClientContext context = new ClientContext(url);
 Web web = context.Web;
 var list = web.Lists.GetByTitle("Esemény");

 CamlQuery cq = new CamlQuery();
 cq.ViewXml= @"<View>
                   <ViewFields>
                       <FieldRef Name='Title' />
                   </ViewFields>
                   <ProjectedFields>
                       <Field Name='PartnerLookupTitle' Type='Lookup' List='PartnerLookup' ShowField='Title' />
                   </ProjectedFields>
                   <Joins>
                       <Join Type='LEFT' ListAlias='PartnerLookup'>
                           <Eq>
                               <FieldRef Name='Partner' RefType='ID' />
                               <FieldRef List='Partner' Name='ID' />
                           </Eq>
                       </Join>
                   </Joins>
               </View>";

ListItemCollection lista =  list.GetItems(cq);
context.Load(lista);
context.ExecuteQuery();

我从服务器获得异常: &#34;价值不在预期范围内。&#34;

如果我删除了CAML查询的ProjectedFields和Joins部分,它可以工作:(

2 个答案:

答案 0 :(得分:0)

在执行CAML SPQuery时,联接不常用。作为一种解决方法,两个列表中的数据可以单独拉出两个

List<SpListItem>

用于检查的对象,然后您可以在两个列表之间进行内存中连接。

答案 1 :(得分:0)

由于格式错误的CAML查询而发生此错误,特别是:

  • ListAlias元素的Join属性的值应包含列表名称
  • List元素的Field属性的值应包含列表名称

以下方法演示了如何构建List Joins and Projections的查询:

public static CamlQuery CreateJoinQuery(string joinListTitle,string joinFieldName,string[] viewdFields,string[] projectedFields)
{
        var qry = new CamlQuery();
        qry.ViewXml = @"<View>
               <ViewFields>";
        foreach(var f in viewdFields) {
            qry.ViewXml+= string.Format("<FieldRef Name='{0}' />",f);
        }
        foreach(var f in projectedFields) {
            qry.ViewXml+= string.Format("<FieldRef Name='{0}{1}' />",joinListTitle,f);
        }
        qry.ViewXml+= @"</ViewFields>
               <ProjectedFields>";
        foreach(var f in projectedFields){
            qry.ViewXml+= string.Format("<Field Name='{0}{1}' Type='Lookup' List='{0}' ShowField='{1}' />",joinListTitle,f);
        }
         qry.ViewXml+= string.Format(@"</ProjectedFields>
               <Joins>
                   <Join Type='LEFT' ListAlias='{0}'>
                       <Eq>
                           <FieldRef Name='{1}' RefType='ID' />
                           <FieldRef List='{0}' Name='ID' />
                       </Eq>
                   </Join>
               </Joins>
           </View>",joinListTitle,joinFieldName);
         return qry;
}

假设以下列表:

  • Contacts - 包含国家/地区查询字段(目标列表:国家/地区)
  • Countries

然后,以下示例演示了如何从两个列表中检索列表项。

<强>用法

var listTitle = "Contacts";
var joinListTitle = "Countries"; 
var joinFieldName = "Country";
var projectedFields = new []{"ID","Title"};
var viewFields = new[] { "Title" };

using (var ctx = new ClientContext(webUri))
{
      var list = ctx.Web.Lists.GetByTitle(listTitle);
      var qry = CreateJoinQuery(joinListTitle,joinFieldName,viewFields,projectedFields);
      var items = list.GetItems(qry);
      ctx.Load(items);
      ctx.ExecuteQuery();
}