从Sharepoint ListItemCollection c#过滤系统字段

时间:2015-08-07 09:38:46

标签: c# linq sharepoint

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

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

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

3 个答案:

答案 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是一个通用列表,其中包含我想要显示的每个字段的名称。