请参阅下面的两个Linq(到SharePoint)代码示例。
唯一的区别是突出显示的代码部分。第一个语句按预期使用硬编码的where子句,但第二组代码在我尝试对项目进行计数时抛出错误“值不在预期范围内”。我错过了什么?
relatedListItems = dc.GetList<GeneralPage>("Pages")
.Where(x => x.RelatedPracticesTitle.Any(y=>y=="Foo"))
if (relatedListItems.Count() == 0)
{…}
Func<GeneralPage, bool> f = x => x.RelatedPracticesTitle.Any(y => y == "Foo");
relatedListItems = dc.GetList<GeneralPage>("Pages")
.Where(f)
if (relatedListItems.Count() == 0)
{…}
答案 0 :(得分:3)
如果它是LINQ to Sharepoint,可能这意味着它应该使用表达式树,而不是委托。尝试:
Expression<Func<GeneralPage, bool>> f =
x => x.RelatedPracticesTitle.Any(y => y == "Foo");
relatedListItems = dc.GetList<GeneralPage>("Pages").Where(f);
顺便说一句,如果您只是想知道是否有任何结果,那么使用Any()
而不是Count()
通常会更好一点 - 这样一旦发现它就会立即返回第一。 (它也更清楚地表达了你对此感兴趣的内容,IMO。)
答案 1 :(得分:1)
在第一种情况下,您正在使用Expression<Func<GeneralPage, bool>>
重载并传递表达式,我认为LINQ to SharePoint将尝试转换为CAML并执行。
在第二种情况下,您正在传递普通Func<GeneralPage, bool>
,因此LINQ to SharePoint无法弄清楚如何撰写查询(它只能看到委托,而不是表达式)。