从 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 是一个通用列表,其中包含我要显示的每个字段的名称。
我遇到了这个问题,我想从 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 是一个通用列表,其中包含我要显示的每个字段的名称。