Ограничить результаты с Microsoft CRM - PullRequest
0 голосов
/ 24 июня 2011

Я использую веб-сервисы Microsoft CRM 2011 для получения списка действий, но запрос истекает из-за объема данных.Я использую пейджинг и попытался выполнить возврат, но затем я получил сообщение об ошибке «Соединение было неожиданно закрыто».

public IEnumerable<LinkedActivity> GetActivitiesForUser() {
  var svc = GetCrmService();
  var cols = new ColumnSet();
  cols.Attributes = new[] { "activityid", "addressused", "scheduledstart", "scheduledend", "partyid", "activitypartyid", "participationtypemask", "ownerid" };
  var query = new QueryExpression();
  query.EntityName = EntityName.activityparty.ToString();
  query.ColumnSet = cols;

  LinkEntity link = new LinkEntity();
  //link.LinkCriteria = filter;
  link.LinkFromEntityName = EntityName.activitypointer.ToString();
  link.LinkFromAttributeName = "activityid";
  link.LinkToEntityName = EntityName.activityparty.ToString();
  link.LinkToAttributeName = "activityid";
  query.LinkEntities = new[] {link};

  var activities = svc.RetrieveMultiple(query);
  var entities = new List<ICWebServices.activityparty>();
  RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse) svc.Execute(request);
  //var pointers = new List<activitypointer>();
  foreach (activityparty c in activities.BusinessEntities)
  {
      //yield return c; - this returned an error "The connection was unexpectedly closed"
      entities.Add(((activityparty)c));
  }

Для реализации пейджинга я использую:

    var activities = GetActivities();
    var offset = startRowIndex > 0 ? activities.Skip(startRowIndex) : activities;
    var limited = limit > 0 ? offset.Take(limit) : offset.Take(100);
    return limited.ToList();

Могу ли я просто вернуть первые 100 предметов?

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Вам необходимо определить PageInfo вашего QueryExpression

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

0 голосов
/ 24 июня 2011

Почему бы не использовать LINQ и пейджинг в своем приложении?

У Linq это изначально есть, а у MS есть конечные точки REST и SOAP.

Я не тестировал, но подозреваю, что конечную точку REST можно использовать напрямую с подкачкой.

public static class PagingExtensions
{
//used by LINQ to SQL
public static IQueryable<TSource> Page<TSource>(this IQueryable<TSource> source, int page, int pageSize)
 {
return source.Skip((page - 1)*pageSize).Take(pageSize);
 }

//used by LINQ
public static IEnumerable<TSource> Page<TSource>(this IEnumerable<TSource> source, int page, int pageSize)
 {
return source.Skip((page - 1)*pageSize).Take(pageSize);
 }

}

class Program
{
static void Main(string[] args)
 {
List<string> names = new List<string>();
 names.AddRange(new string[]{"John","Frank","Jeff","George","Bob","Grant", "McLovin"});
foreach (string name in names.Page(2, 2))
 {
Console.WriteLine(name);
 }

 }
}
0 голосов
/ 24 июня 2011

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

...