Linq到Sharepoint导致无效转换



我正在用c#编程一个Silverlight应用程序,它从sharepoint获取列表。我想要列表中特定列的不同元素。获得查询后,我无法处理var-datatype。当我想要进行数据广播时,例如在listtitemcollection中,该程序每次都存在。

代码如下:

ListItemCollection bla;
var result = bla.Select(m => m["Region"]).Distinct();
ListItemCollection a = (ListItemCollection)result; //Error happens here

LINQ处理IEnumerable<>或IQueryable<>的实例。根据原始集合的类型,Distinct返回IEnumerable<>或IQueryable<>。在你的例子中,它返回一个IQueryable

您正在尝试将IQueryable强制转换为listtitemcollection,这可以理解地导致无效强制转换异常。

你不需要做其他事情来开始处理这些项目。您可以使用foreach对它们进行迭代,使用ToArray()ToList()等将它们转换为数组或列表

SharePoint的Linq提供程序不支持Distinct操作符,这就是发生此错误的原因。

根据MSDN:

一些LINQ查询不能完全转换为CAML。然而,然而,这样的查询在原则上可以正确运行,因为它们可以分两个阶段执行。首先,LINQ到SharePoint提供程序将尽可能多的查询转换为CAML并执行该查询查询

请参考不支持的LINQ查询和两阶段查询获得更多详细信息。

两阶段方法

要纠正这个错误,您应该将查询分成两个阶段,以强制执行第一个查询,然后执行第二个查询。要做到这一点,例如,您应该转换列表中的第一个IEnumerable<T>,这要归功于ToList()方法。

下面的例子演示了如何从ListItemCollection对象返回唯一值:

var result = items.ToList().Select(i => i["Region"].ToString()).Distinct(); //System.Linq.Enumerable.DistinctIterator<string> type
foreach (var item in result)
{
      //...
}

相关内容

  • 没有找到相关文章

最新更新