【发布时间】:2014-01-20 22:38:11
【问题描述】:
我尝试过搜索,但似乎没有找到任何相关的答案。也许是因为我不确定如何提出我的问题。
我正在编写一个类库来帮助使用 SharePoint 的客户端对象模型。执行查询时,可以指定应加载返回对象的哪些属性,以避免不必要的网络流量。这是通过 Lambda 表达式完成的。
这是一个有效的例子:
public ListItemCollection GetItems(
params Expression<Func<ListItemCollection, object>>[] retrievals)
{
var query = new CamlQuery {...};
ListItemCollection queryResults = _list.GetItems(query);
ReloadClientObject(queryResults, retrievals)
return queryResults;
}
public void ReloadClientObject<T>(T clientObject,
params Expression<Func<T, object>>[] retrievals)
where T : ClientObject
{
_context.Load(clientObject, retrievals);
_context.ExecuteQuery();
}
调用示例:
var items = GetItems(items => items.Include(
item => item.Id,
item => item.DisplayName));
一切都会好的。但我宁愿返回IEnumerable<ListItem> 而不是ListItemCollection 并且我想传递Expression<Func<ListItem, object>> 类型的参数而不是Expression<Func<ListItemCollection, object>>...根本不向用户介绍ListItemCollection。 所以我想将 Include() 调用移动到我的方法主体...这就是我卡住的地方。
这是我目前所得到的:
public IEnumerable<ListItem> GetItems(
params Expression<Func<ListItem, object>>[] retrievals)
{
var query = new CamlQuery {...};
ListItemCollection queryResults = _list.GetItems(query);
ReloadClientObject(queryResults, items => items.Include(retrievals))
_context.ExecuteQuery();
return queryResults.AsEnumerable();
}
示例调用(更简洁更好):
var items = GetItems(item => item.Id, item => item.DisplayName));
但是,这会在调用 Load() 方法时抛出 OperationNotSupportedException。
如有任何指导,我将不胜感激。谢谢!
【问题讨论】:
-
异常信息是什么?
-
我相信它是空的......或者通常没有帮助。
-
你不想
items => items.Select(x => new { x.ID, x.DisplayName })。我没有仔细阅读您的问题,但看起来您正在尝试使用Include进行投影,而Select正是为此目的而制作的。 -
@evanmcdonnal 例如,通过使用匿名对象而不是实际的
ListItem,您无法更新项目。 -
使用您提供的后一个代码,它按我的预期工作;它似乎没有任何问题。
标签: c# linq sharepoint lambda parameter-passing