#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:
Используйте вычисляемый столбец, который преобразует логическое значение в текст.