2011-06-24 17 views
0

Microsoft CRM 2011 Webサービスを使用してアクティビティの一覧を取得していますが、データ量のために要求がタイムアウトしています。私はページングを実装していて、利回りを返そうとしましたが、「接続が予期せず閉じられました」というエラーが発生しました。Microsoft CRMでの結果の制限

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個のアイテムを返すことができる方法はあります:

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)); 
    } 

は、私が使用しているページングを実装するには?

答えて

0

tyrongowerが正しいPageInfoを定義する必要があります。また、適切に処分されるように、usingステートメントでサービスをラップする必要があります。

0

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); 
} 

} 
} 
関連する問題