2008-12-04 78 views
5

CAML我可以查询SharePoint Listitems使用“包含”元素,但没有“不包含”我可以使用的元素。“不包含”CAML中?

那么获取不包含字符串的项目的最佳方法是什么?有没有更好的方法,而不是遍历每一个项目?

回答

4

BeginWith也适用同样的限制。我不知道有什么好的解决办法。你可以做什么:做一个Contains-Query,遍历每个项目并获取ID,然后为“ID NotEqual 1或ID NotEqual 2或ID NotEqual 3 ......”做另一个大查询。由于ID被索引为据我所知,这对数据库应该有一个较小的影响,但它仍然闻起来真的很糟糕。

对于小列表无关紧要,对于较大的列表,我会使用SQL Server Profiler来查看影响是什么。

+0

它闻起来真的不好,你有没有尝试过,除了查询的其他部分使用计算列? – 2010-03-04 21:28:23

+0

@AlexanderN例如,如果您正在筛选Created字段或其他属于内容类型一部分的字段(这些字段在列列表中看起来不可用),则计算列并不总是有效。 – 2010-03-04 21:35:08

0

'Contains'和'BeginsWith'的问题也困扰我。我希望在下一个版本的SharePoint中,caml将被扩展为真正的工具,而不仅仅是我们的腿。

我这样做的方式是尽可能指定查询,然后筛选与C#代码中的条件不匹配的行。这有时候非常难看,因为有时你必须处理100行,并以符合条件的1个结果结束。

0

@drax:让我们希望CAML消失 - 期间。这绝对是当前SP编程最糟糕的一个方面。

3

那么得到不包含字符串的 项目的最佳方法是什么?

尝试使用计算列来反映您通过创建相反值所查看的值。

例如,说该列被称为IsCritical。那么,作为 “YES/NO” 和公式加列

=ISNUMBER(FIND("Critical"), [Title])) 

然后在你的CAML查询

<Query> 
<Where> 
    <Eq> 
    <FieldRef Name='IsCritical'/> 
    <Value Type='Boolean'>0</Value> 
    </Eq> 
</Where> 
</Query> 

A 0在此查询还挺体现 “并不重要”。然而,我不确定可能会有什么表现,而不是有一个原生的CAML“Not Containts”,不幸的是它不存在。

请参见CAML Query Schema at MSDN

0

尽量不包括

<NotIncludes> 
<FieldRef Name='FileLeafRef' /> 
              <Value Type='Text'>stringvalue</Value> 
             </NotIncludes>