Использование Where () с динамическим Func не работает, но работает с жестко закодированным предложением Where () - PullRequest
0 голосов
/ 02 августа 2011

См. Два примера кода 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 ]

3 голосов
/ 02 августа 2011

Если это LINQ to Sharepoint, вероятно, это означает, что он должен использовать деревья выражений, а не делегаты.Попробуйте:

Expression<Func<GeneralPage, bool>> f = 
    x => x.RelatedPracticesTitle.Any(y => y == "Foo");
relatedListItems = dc.GetList<GeneralPage>("Pages").Where(f);

Кстати, обычно лучше использовать Any() вместо Count(), если вы просто хотите узнать, есть ли какие-либо результаты - таким образом, он может вернуться сразукак он нашел первый.(Это также выражает то, что вас интересует более четко, ИМО.)

1 голос
/ 02 августа 2011

В первом случае вы используете перегрузку Expression<Func<GeneralPage, bool>> и передаете выражение , которое, как я предполагаю, LINQ to SharePoint попытается преобразовать в CAML и выполнить.

Во втором случае вы передаете простой Func<GeneralPage, bool>, поэтому LINQ to SharePoint не может понять, как составить запрос (он видит только делегата, а не выражение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...