我使用 CSOM .NET 从 Project Server 2013 加载任务对象,我需要
- 过滤任务,以便只返回其中的一个子集,并且
- 仅加载用户在运行时指定的任务列的子集。
我发现这篇文章展示了如何加载一组动态列,它很好地满足了我的第二个要求。但是,我想不出一个可行的 LINQ 语法来结合列选择和行过滤。
在下面的示例中,我只需要为摘要任务加载那些“行”(其中t.IsSummary为true),并且我只想加载Name、Start和Finish列。
引用帖子中的以下代码仅加载我需要的三列:
foreach (string fieldName in new List<string>(){"Name","Start","Finish"});
{
ctx.Load(ctx.Tasks,c => c.Include(t => t[fieldName]));
}
ctx.ExecuteQuery();
但是,当我尝试将where()和include()组合成唯一对我有意义的语法时,我在通过 foreach 循环进行第二次迭代时得到InvalidQueryExpressionException:“不支持查询表达式。”
foreach (string fieldName in new List<string>(){"Name","Start","Finish"});
{
ctx.Load(ctx.Tasks,
c => c.Where(t => t.IsSummary),
c => c.Include(t => t[fieldName])
);
}
ctx.ExecuteQuery();
如果我颠倒where和include子句的顺序,我会得到同样的错误。如果我将where子句拉到字段名称的循环之外并使其成为单独的Load调用,则摘要任务行过滤有效,但我失去了任务字段的动态选择。CSOM 的 LINQ 中必须有满足这两个要求的语法。执行此类查询的正确语法是什么?