C # sharepoint, как получить элементы списка из определенного представления - PullRequest
0 голосов
/ 24 августа 2018

Я хочу получить все элементы списка для определенного вида. Теперь я могу получить предметы, но каждый раз у меня есть 22000 предметов. Но с точки зрения Майна у меня есть только два пункта.

enter image description here

Мой код написан на основе других сообщений в Stackoverflow:

using (var ctx = new ClientContext("http://sp2.intranet.mmmm.net/LWW/Europe/Warsaw/loc/eng/"))
{
      Web web = ctx.Web;
      var tasksList = web.Lists.GetByTitle("Collaboration-Intracompany");

      ctx.ExecuteQuery();
      Microsoft.SharePoint.Client.View view = tasksList.Views.GetByTitle("Main");
      ctx.Load(view);
      ctx.ExecuteQuery();

      CamlQuery camlQuery1 = new CamlQuery();
      camlQuery1.ViewXml = view.ViewQuery;
      // camlQuery1.ViewXml = @"<View><Query><Where><IsNotNull><FieldRef Name='ID' /></IsNotNull></Where></Query><ViewFields><FieldRef Name='ID' /></ViewFields></View>";
      //camlQuery1.ViewXml = @"<View><Query><Where><Eq><FieldRef Name=\'DisplayName\' /><Value Type=\'Text\'>Main</Value></Eq></Where></Query></View>";

      ListItemCollection listItems = tasksList.GetItems(camlQuery1);

      ctx.Load(listItems);
      ctx.ExecuteQuery();
}

Мой текущий ViewXml ниже. Возвращает 4 элемента с «ENG In Progress». Но эти 4 пункта с разных точек зрения. Как отфильтровать, чтобы вернуть только элементы из вида Main?

     CamlQuery camlQuery1 = new CamlQuery();

        camlQuery1.ViewXml = "<View Name="{326A70B3-515F-4B92-B8FA-506865D192AF}" DefaultView="TRUE" Type="HTML" TabularView="FALSE" DisplayName="Main" Url="/LWW/Europe/Warsaw/loc/eng/Lists/CollaborationIntracompany/all.aspx" Level="1" BaseViewID="1" ContentTypeID="0x" ImageUrl="/_layouts/images/generic.png">
   <ViewFields>
      <FieldRef Name="LinkTitle" />
      <FieldRef Name="Task_x0020_Status" />
      <FieldRef Name="Priority" />
      <FieldRef Name="Assigned_x0020_To2" />
      <FieldRef Name="Deadline" />
      <FieldRef Name="Author" />
      <FieldRef Name="Modified" />
      <FieldRef Name="Activity" />
   </ViewFields>
   <Query>
      <Where>
         <Eq>
            <FieldRef Name="Task_x0020_Status" />
            <Value Type="Text">ENG In Progress</Value>
         </Eq>
      </Where>
   </Query>
   <Aggregations Value="Off" />
   <RowLimit Paged="TRUE">300</RowLimit>
   <Mobile MobileItemLimit="3" MobileSimpleViewField="LinkTitle" />
   <Toolbar Type="Standard" ShowAlways="TRUE" />
   <XslLink Default="TRUE">main.xsl</XslLink>
   <ParameterBindings>
      <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" />
      <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_DEFAULT)" />
   </ParameterBindings>
</View>";

         ListItemCollection listItems = tasksList.GetItems(camlQuery1);

И когда я удаляю запрос:

 camlQuery1.ViewXml = ""
                        + "<View Name='{326A70B3-515F-4B92-B8FA-506865D192AF}' DefaultView='TRUE' Type='HTML' TabularView='FALSE' DisplayName='Main' Url='/LWW/Europe/Warsaw/loc/eng/Lists/CollaborationIntracompany/all.aspx' Level='1' BaseViewID='1' ContentTypeID='0x' ImageUrl='/_layouts/images/generic.png'>"
                        + "<ViewFields>"
                         + "<FieldRef Name='LinkTitle' /><FieldRef Name='Task_x0020_Status' /><FieldRef Name='Priority' /><FieldRef Name='Assigned_x0020_To2' /><FieldRef Name='Deadline' /><FieldRef Name='Author' /><FieldRef Name='Modified' /><FieldRef Name='Activity' /></ViewFields>"
                        //  + "<Query><Where><Eq><FieldRef Name='Task_x0020_Status' /><Value Type='Text'>ENG In Progress</Value></Eq></Where></Query>"
                           + "<Aggregations Value='Off' /><RowLimit Paged='TRUE'>300</RowLimit><Mobile MobileItemLimit='3' MobileSimpleViewField='LinkTitle' />"
                           + "<Toolbar Type='Standard' ShowAlways='TRUE' /><XslLink Default='TRUE'>main.xsl</XslLink><ParameterBindings>"
                           + "<ParameterBinding Name='NoAnnouncements' Location='Resource(wss,noXinviewofY_LIST)' />"
                           + "<ParameterBinding Name='NoAnnouncementsHowTo' Location='Resource(wss,noXinviewofY_DEFAULT)' /></ParameterBindings></View>";

Возвращает 300 элементов, поскольку ограничение составляет 300. На картинке видно, что в главном окне есть только 4 позиции. Как получить именно эти 4 позиции?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Поскольку CamlQuery.ViewXml Свойство ожидает View в качестве корневого элемента, в представленном примере строку:

camlQuery1.ViewXml = view.ViewQuery;

необходимо заменить на:

camlQuery1.ViewXml = String.Format("<View><Query>{0}</Query></View>", view.ViewQuery); 

Итак, вот общий пример того, как получить элементы списка для каждого представления:

   //1.Request view query
   var list = ctx.Web.Lists.GetByTitle(listName);
   var view = list.Views.GetByTitle(viewName);
   ctx.Load(view);
   ctx.ExecuteQuery();

   //2.construct list query from view query and retrieve items 
   var qry = new CamlQuery();
   qry.ViewXml = String.Format("<View><Query>{0}</Query></View>", view.ViewQuery); 
   var items = list.GetItems(qry);
   ctx.Load(items);
   ctx.ExecuteQuery(); 

О группировке

Но здесь идет сложная часть, на предоставленном скриншоте только сгруппированы (в частности, свернутые) элементы отображаются.Дело в том, что в SharePoint GroupBy элемент ведет себя не совсем так, как ожидалось (например, как GROUP BY в SQL), что означает, что все элементы на запрос представления возвращаются дажеесли применяется оператор GroupBy.

Для извлечения точно таких же данных , которые отображаются в виде списка, лучше использовать метод List.RenderListData, например:

var list = ctx.Web.Lists.GetByTitle(listName);
var view = list.Views.GetByTitle(viewName);
ctx.Load(view);
ctx.ExecuteQuery();

var qry = new CamlQuery();
qry.ViewXml = String.Format("<View><Query>{0}</Query></View>", view.ViewQuery);
var result = list.RenderListData(qry.ViewXml);
ctx.ExecuteQuery();

//parse json and print
var data = JObject.Parse(result.Value);
foreach (var row in data["Row"])
{
    Console.WriteLine(row["Status"]);
}
0 голосов
/ 24 августа 2018

Я видел что-то об этом раньше.

Попробуйте

camlQuery1.ViewXml = "<View><Query>" + view.ViewQuery + "</Query></View>";

Приветствия

Truez

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...