从 Sharepoint ListItemCollection c# 过滤系统字段

Filter system fields from Sharepoint ListItemCollection c#

我遇到了这个问题,我想从 ListItemCollection 中过滤掉一些不需要的字段。具体来说,我有一个 IEnumerable,在显示我的数据时要包含几个字段名称。在我为我的 ListItemCollection 加载客户端上下文时,我使用静态 Linq 表达式来获取我需要的字段。像这样:

  clientContext.Load(collListItem,
            items => items.Include(
                item => item["Permissions"],
                item => item["User"]));

目前这对我有用,但当我稍后通过 csom 添加自定义字段时,恐怕这种方法不够用。任何帮助将不胜感激。

如果我正确理解你的问题,你想过滤 ListItemCollection 中的 ListItem

这有什么帮助吗?您可以动态构造 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

ClientRuntimeContext.Load method省略retrievals参数,例如:

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();

抱歉这么久才回复,我正在训练中。无论如何,我设法使用以下语法解决了问题。

foreach (string li in fieldsToDisplay)
{
    clientContext.Load(collListItem,
        items => items.Include(
            item => item[li]));
}

其中变量 fieldsToDisplay 是一个通用列表,其中包含我要显示的每个字段的名称。