Linq 使用CSOM c一次性加载多个sharepoint列表项字段

Linq 使用CSOM c一次性加载多个sharepoint列表项字段,linq,sharepoint,lambda,csom,Linq,Sharepoint,Lambda,Csom,我有一个字符串数组中的字段列表,而不是column1和column2,我如何在include linq中传递它,而不能在运行时创建正确的lambda。我尝试了以下方法,但没有成功。静态befor循环工作,但在循环中添加的thw字段失败,因为它不计算循环中的字符串值 ***ctx.Load(listItemCollection, eachItem => eachItem.Include( item => item, item

我有一个字符串数组中的字段列表,而不是column1和column2,我如何在include linq中传递它,而不能在运行时创建正确的lambda。我尝试了以下方法,但没有成功。静态befor循环工作,但在循环中添加的thw字段失败,因为它不计算循环中的字符串值

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


  

请参考以下代码:

      ***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++;
     }***

您可以将鼠标悬停在load方法上,查看它需要什么类型的参数,然后生成相应的参数并传递它。

我必须在运行时创建lambda表达式。在下面的代码中,我能够得到预期的值

表达式[]参数=新表达式[长度]


我尝试了这个方法,但在循环item=>item[s]中,没有替换s,因为字符串s类似于getvalueclassname.method。。我必须创建表达式。我能够做到,只是发布了答案。@AnilArora为什么要替换任何东西?这些表达式将转换为CAML。只有CAML被发送到服务器,因此如果您想通过指定字段名创建查询,请构建CAML查询。如果您必须编写这么多代码,那么您就错了。你也没有发布任何LINQ codde,那只是表达方式而已。。。某物CSOM不仅仅是LINQ,所以如果你想要比LINQ更动态的东西,顺便问一下,你想要什么?您可以使用API的其余部分。SharePoint API允许将字段指定为字符串,甚至是服务器端模型,因为检索单个列表项的成本太高。字段存储在实体属性值(如模式)中,因此即使检索单个项也需要大量工作和对编码字段的解析。最糟糕的情况是,您可以自己编写由表达式生成的CAML查询。或者您可以在选择参数What LINQ code中使用并指定字段名?问题中没有LINQ代码,只有从已加载的ListItem读取字段的表达式。所有SharePoint API都允许字段选择,即使是服务器端模型,这仅仅是因为即使在服务器上读取整个列表项的成本也太高,而且所有这些都是从以字符串形式传递字段列表开始的。LINQ是后来添加的,作为一个方便的API。事实上,LINQ查询被转换为CAML。尝试用于指定字段的表达式仍将转换为CAML。因此,不要试图使用字符串来构建表达式来构建字符串,只需传递字符串即可
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();
 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++;
       }