Linq 使用CSOM c一次性加载多个sharepoint列表项字段
我有一个字符串数组中的字段列表,而不是column1和column2,我如何在include linq中传递它,而不能在运行时创建正确的lambda。我尝试了以下方法,但没有成功。静态befor循环工作,但在循环中添加的thw字段失败,因为它不计算循环中的字符串值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
***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++;
}