我正在使用c#编写Silverlight应用程序,它从sharepoint获取列表。 我想要列表中特定列的不同元素。 获取查询后,我无法处理var-datatype。每当我想创建数据广播时,程序就存在,例如在ListItemCollection中。
以下是代码:
ListItemCollection bla;
var result = bla.Select(m => m["Region"]).Distinct();
ListItemCollection a = (ListItemCollection)result; //Error happens here
答案 0 :(得分:1)
LINQ处理IEnumerable<>的实例或IQueryable<>。 Distinct
返回IEnumerable<>或IQueryable<>取决于原始集合的类型。在您的情况下,它返回IQueryable
您正在尝试将该IQueryable强制转换为ListItemCollection,这可以理解地导致无效的强制转换异常。
您不需要做其他事情就可以开始处理这些项目了。您可以使用foreach
对其进行迭代,将其转换为包含ToArray()
和ToList()
等的数组或列表
答案 1 :(得分:1)
Linq提供程序for SharePoint不支持Distinct
运算符,这就是发生此错误的原因。
根据MSDN:
某些LINQ查询无法完全转换为CAML。然而, 但是,这些查询原则上可以正确运行,因为它们可以 分两个阶段执行。首先,LINQ to SharePoint提供程序 将尽可能多的查询转换为CAML并执行它 查询
请参阅Unsupported LINQ Queries and Two-stage Queries了解更多详情。
要更正此错误,您应该分两个阶段剪切查询,以强制第一个查询在第二个查询之前执行。为此,您应该例如通过IEnumerable<T>
方法转换列表中的第一个ToList()
。
以下示例演示了如何从ListItemCollection
object返回唯一值:
var result = items.ToList().Select(i => i["Region"].ToString()).Distinct(); //System.Linq.Enumerable.DistinctIterator<string> type
foreach (var item in result)
{
//...
}