1

.net csom アプリケーションで結合を使用して作業クエリを作成できません。私はこの記事を使用していました:

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 を実行する場合、結合は一般的に使用されません。回避策として、2 つのリストからのデータを 2 つのリストに別々にプルすることができます。

List<SpListItem>

たとえば、2 つのリスト間でメモリ内結合を実行できます。

于 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 に答える