1

我无法在我的 .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();

我从服务器收到异常:“值不在预期范围内。”

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

4

2 回答 2

0

执行 CAML SPQuery 时不常用连接。作为一种解决方法,可以将两个列表中的数据分别提取为两个

List<SpListItem>

例如对象,然后您可以在两个列表之间进行内存连接。

于 2013-09-27T14:49:27.017 回答
-1

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

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

以下方法演示了如何为List Joins 和 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();
}
于 2015-02-26T23:06:04.743 回答