Read complete project data (Project level + Task level info) with a single request using CSOM for Project Server or Project Online

Hello Readers!

Thanks for reading this post.

In this post, I’m going to show a way to load the whole “Project and Tasks” data for a given project in a single request to the server using CSOM. When I say complete Project and Task data it includes project properties, project level custom fields, Task properties, Task level custom fields including lookup tables and entries. Earlier, I used to hit the server for every task to read the task level level custom fields.  Below is the simple load query that brings all the data at once in a single hit.

Note: If something is not loaded and asking you for “Initialize explicitly” just add that property in the load query.


 var projColl = context.LoadQuery(context.Projects
                        .Where(p => p.Id == projectGuid)
                        .Include(
                            p => p.Id,
                            p => p.Name,
                            p => p.StartDate,
                            p => p.FinishDate,                            
                            p => p.LastPublishedDate,
                            p => p.CustomFields,
                            p => p.IncludeCustomFields,
                            p => p.IncludeCustomFields.CustomFields,              
                            p => p.Tasks,
                            p => p.Tasks.Include(
                                t => t.Id,
                                t => t.Name,                                
                                t => t.Parent,
                                t => t.Predecessors,
                                t => t.Successors,
                                t => t.TotalSlack,
                                t => t.CustomFields,
                                t => t.CustomFields.IncludeWithDefaultProperties(
                                    cf => cf.LookupTable,
                                    cf => cf.LookupEntries
                                )
                            )
                        )
                    );
                context.ExecuteQuery();

this really saves lot of time and also improves the performance.