使用具有动态Func的Where()失败,但使用硬编码的Where()子句

时间:2011-08-01 22:35:48

标签: linq sharepoint-2010

请参阅下面的两个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)
                    {…}

2 个答案:

答案 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无法弄清楚如何撰写查询(它只能看到委托,而不是表达式)。