Anil Arora
Anil Arora

Reputation: 11

Load multipe sharepoint list item fields in one Go using CSOM c#

       ***ctx.Load(listItemCollection,
       eachItem => eachItem.Include(
        item => item,
        item => item["Column1"],
      item => item["Column2"]
      ));***


  

i have list of fields in a array of string instead of column1 and column2, how can i pass it through in include linq, not able to create proper lambda on runtime. i tried following ways but couldn't get success. Static befor loops works but thw fields added in loop fails as it doesn't evaluate string value in loop

      ***Expression<Func<ListItem, object>>[] paramss = new 
       Expression<Func<ListItem, object>>[length];
      paramss[0] = x => x.ContentType;
       paramss[1] = x => x["Title"]; 
      count = 2;
   foreach (string item in solConnDefModel.Columns)
    { paramss[count] = x => x[item]; 
       count++;
     }***

Upvotes: 0

Views: 1307

Answers (2)

Baker_Kong
Baker_Kong

Reputation: 1889

Please take a reference of below code:

List dlist = context.Web.Lists.GetByTitle("listname");

context.Load(dlist);
context.ExecuteQuery();


string[] fieldNames = { "Id", "Title", "num", "mStartDate" };
// Create the expression used to define the fields to be included
List<Expression<Func<ListItemCollection, object>>> fieldsToBeIncluded = new List<Expression<Func<ListItemCollection, object>>>();                       

foreach (string s in fieldNames)
{
    fieldsToBeIncluded.Add(items => items.Include(item => item[s]));
}

// Initialize the collection of list items         

var listItems = dlist.GetItems(new CamlQuery());
context.Load(listItems, fieldsToBeIncluded.ToArray());
context.ExecuteQuery();

You can hover on load method to see what type parameter it requires, then generate a corresponding one and pass it.

Upvotes: 1

Anil Arora
Anil Arora

Reputation: 11

i have to create lambda expression at runtime. following code i was able to get expected value

Expression<Func<ListItem, object>>[] paramss = new Expression<Func<ListItem, object>>[length];

 foreach (string item in Columns)
   {
  if (item.ToLower() != "contenttype")
   {
   ParameterExpression parameter = Expression.Parameter(typeof(ListItem), "x");
       var propertyInfo = typeof(ListItem).GetMethod("get_Item");                
     
     var arguments = new List<Expression> { Expression.Constant(item) };
      var expression = Expression.Call(parameter, propertyInfo, arguments);
    var lambda = Expression.Lambda<Func<ListItem, object>>(expression, parameter);
        paramss[count] = lambda;

     }
     else
     {
         paramss[count] = x => x.ContentType;
     }
   count++;
       }

Upvotes: -1

Related Questions