SPQuery: объединение списков и where во внешнем списке

#c# #sharepoint #caml #sharepoint-api #spquery

#c# #sharepoint #caml #sharepoint-api #spquery

Вопрос:

Привет, разработчики Sharepoint!

Вы когда-нибудь пытались выполнить объединение между списками, и в обоих этих списках требовалось поместить предложение where? Я могу сделать это в первом списке, но не могу выяснить, как поместить where во внешний список.

Я попробовал несколько решений, подобных этому :

 using (SPWeb web = sps.OpenWeb())
            {
                SPList spl = web.GetList(customers);
                SPQuery query = new SPQuery();
                query.Query = "<Where><Eq><FieldRef Name='Suspended'/><Value Type='Boolean'>0</Value></Eq></Where>";
               query.Joins=@"<Join Type='Inner' ListAlias='CountryList'><And><Eq><FieldRef Name='Country' RefType='Id'/><FieldRef List='CountryList' Name='ID'/></Eq><Eq><FieldRef List='CountryList' Name='Continent' /><Value Type='Text'>Europe</Value></Eq>
                        </And></Join>";
                ....
  

Но это не работает. Я хочу, чтобы все не приостановленные клиенты приходили из всех городов (другой список) в Европе. Итак, мне нужно, где в основном списке (spl) получать не приостановленных клиентов и где в зарубежном списке получать города только из Европы. Я, по-видимому, не могу поместить свой where в элемент Join. Я попытался поместить это в запрос, указав псевдоним списка, но это тоже не работает.

у вас есть идея? Спасибо!

Ответ №1:

Хорошо, я нашел свой ответ :

Вы можете добавить предложение where даже во внешний список, но целевое поле не может быть логическим : ( потому что существуют поддерживаемые типы (ProjectedFields). На самом деле, если вы хотите отфильтровать внешний список по его определенному полю, вы могли бы объявить его в элементе projected fields, чтобы они были распознаны в вашем предложении where в свойстве запроса SPQuery.

Например, в предыдущем случае,

  SPList spl = web.GetList(customers);
            SPQuery query = new SPQuery();
            query.Query = @"<Where><And>
<Eq><FieldRef Name='Suspended'/><Value Type='Boolean'>0</Value></Eq>
<Eq><FieldRef Name='ContinentCountryList' List="CountryList"/><Value Type='Text'>Europe</Value></Eq>
</And></Where>";
               query.Joins=@"<Join Type='Inner' ListAlias='CountryList'><Eq><FieldRef Name='Country' RefType='Id'/><FieldRef List='CountryList' Name='ID'/></Eq>
                     </Join>";
    query.ProjectedFields = "<Field Name='ContinentCountryList' Type='Lookup' List='CountryList' ShowField='Continent'/>
  

Теперь это работает, я буду получать не приостановленных клиентов только из городов Европы. Итак, я должен ссылаться на свое внешнее поле в элементе projectedFields. Но это работает только с типами, перечисленными выше по ссылке msdn…

слишком плохо для меня, что это было логическое значение, я думаю, я должен иметь дело с временными списками в памяти, если у вас нет других предложений…

Ответ №2:

Используйте вычисляемый столбец, который преобразует логическое значение в текст.