Linq to Sharepoint导致无效的强制转换

时间:2014-03-20 14:05:38

标签: linq list sharepoint distinct

我正在使用c#编写Silverlight应用程序,它从sharepoint获取列表。 我想要列表中特定列的不同元素。 获取查询后,我无法处理var-datatype。每当我想创建数据广播时,程序就存在,例如在ListItemCollection中。

以下是代码:

ListItemCollection bla;

var result = bla.Select(m => m["Region"]).Distinct();

ListItemCollection a = (ListItemCollection)result; //Error happens here

2 个答案:

答案 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)
{
      //...
}