我有这个问题,我想从ListItemCollection中过滤掉一些不需要的字段。具体来说,我有一个IEnumerable,在显示我的数据时要包含几个字段名称。在我为ListItemCollection加载客户端上下文时,我使用静态Linq表达式来获取我需要的字段。像这样:
clientContext.Load(collListItem,
items => items.Include(
item => item["Permissions"],
item => item["User"]));
目前这对我有用,但是当我稍后通过csom添加自定义字段时,我担心这种方法是不够的。任何帮助将不胜感激。
答案 0 :(得分:0)
如果我正确理解了您的问题,您希望过滤ListItem
中的ListItemCollection
。
这有什么帮助吗?您可以动态构建allowedFields
var lic = new ListItemCollection();
for (var i = 0; i < 5; i++)
{
var fieldName = string.Format("field {0}", i);
var fieldValue = string.Format("Value {0}", i);
lic.Add(new ListItem(fieldName, fieldValue));
}
var allowedFields = new List<string>
{
"field 1",
"field 4"
};
var listItems = lic.Cast<ListItem>().Where(i => allowedFields.Contains(i.Text));
这将产生2个项目。
或采用void Load<T>(T clientObject, params Expression<Func<T, Object>>[] retrievals) where T : ClientObject
格式
var func = new Func<ListItemCollection, Object>
(collection =>
lic.Cast<ListItem>()
.Where(i => allowedFields.Contains(i.Text))
);
Load(new ClientObject(), o => func);
答案 1 :(得分:0)
您可以考虑以下选项
选项1
忽略<{em} retrievals
ClientRuntimeContext.Load method的参数,例如:
var list = ctx.Web.Lists.GetByTitle(listTitle);
var item = list.GetItemById(itemId);
ctx.Load(item);
ctx.ExecuteQuery();
选项2
动态指定字段名称,如下所示:
var list = ctx.Web.Lists.GetByTitle(listTitle);
var item = list.GetItemById(itemId);
var fields = list.Fields;
ctx.Load(fields);
ctx.ExecuteQuery();
var fieldNames = fields.Where(f => !f.FromBaseType).Select(f => f.InternalName).ToList(); //field names to retrieve: only user defined fields
ctx.Load(item, fieldNames.Select(fieldName => (Expression<Func<ListItem, object>>) (i => i[fieldName])).ToArray());
ctx.ExecuteQuery();
答案 2 :(得分:-1)
很抱歉,花了这么长时间回复,我正在接受培训。无论如何,我设法使用以下语法解决问题。
foreach (string li in fieldsToDisplay)
{
clientContext.Load(collListItem,
items => items.Include(
item => item[li]));
}
变量fieldsToDisplay是一个通用列表,其中包含我想要显示的每个字段的名称。