sharepoint搜索多个列表

sharepoint搜索多个列表

客户需要按条件筛选网站下的所有合同列表,并且要有分页功能。

在网上找到了SPSiteDataQuery这个对象可以对网站中的所有列表进行搜索。

一下内容来源:http://www.cnblogs.com/Kenr/archive/2009/06/02/1494260.html

Webs

此元素的属性只有一个:Scope。能赋予它的值有3个吧,尽管MSDN上说只有2个…..

①    "<Webs Scope=‘SiteCollection‘ />",包含当前网站所在的网站集(Site)下所有网站(Web)以及子网站(Web)

②    "<Webs Scope=‘Recursive‘ />",包含当前网站(Web)以及其下的所有子网站(Web)

③    缺省,仅仅包含当前网站(Web)

Lists

此元素将定义你在文档库(Document Libraries)或者列表(Lists)里的搜索范围。
属性有4个:BaseType、ServerTemplate、Hidden、MaxListLimit
此外,子元素有两个:List、WithIndex。使用子元素可以将搜索条件限制在比较小的范围之内。
下面是关于属性的介绍。

①    BaseType  (例:"<Lists BaseType=‘1‘/>")
定义检索范围,上例为搜索所有的文档库,其他可以设定的值还有


Value


检索范围


说明


0


Generic list


除文档库(Document library)以外的所有列表(Lists)


1


Document library


仅仅查询文档库


3


Discussion forum


论坛


4


Vote or Survey


问卷调查


5


Issues list


讨论

(‘2‘是隐藏属性吗…   (-"-;) ??)
   必须要注意的是这个属性的默认值为"<Lists BaseType=‘0‘/>",也就是说缺省或者该属性设置出错时会查询文档库以外的所有列表。

②    ServerTemplate (例: "<Lists ServerTemplate=‘850‘/>")
搜索指定类型的列表(850为页面库列表类型)。这个属性的值出错时会以默认值进行查询。
关于ServerTemplate的值,参考附录1

③    Hidden (例:"<Lists ServerTemplate=‘850‘ Hidden=‘TRUE‘/>")
设定能否搜索隐藏列表。默认是搜索所有非隐藏的列表。

④    MaxListLimit (例:"<Lists BaseType=‘1‘ MaxListsLimit=‘500‘/>")
定义搜索的列表的总数,当超过这个数字时,SPSiteDataQuery会抛出一个SPException的例外。这个属性的默认值为1000。当把此属性设置为0时,那么搜索的列表数目将不会受到限制。
(关于这个属性,有人说默认值是2000,也有人说SP1的时候已经把这个问题修正过来了,具体怎么样有待考证….)

至于子元素个人不是很了解,也不常用。简单的介绍一下好了。

①    子元素List
(例:<Lists>
                    <List ID="7A9FDBE6-0841-430a-8D9A-53355801B5D5" />
                    <List ID="3D18F506-FCA1-451e-B645-2D720DC84FD8" />
         </Lists>)
仅仅搜索在ID属性内指定的列表。只有知道搜索列表的Guid时才可以使用哦~。

②    子元素WithIndex
(例:<Lists>
                    <WithIndex FieldId="D4819257-6B69-41F1-82C8-A91615BFF500" Type="Text" Value="Complete" />
         </Lists>)
为搜索指定一个索引列。Type属性的值必须是“Text”,Value为该列的值。
搜索将会被限制在拥有指定Field的列表内。(可以把一个Field理解为列表的一个列名)
WithIndex有3个属性FieldId, Value, Type。并且Type属性的值必须是“Text”。在上面的例子里,SPSiteDataQuery会搜索出那些指定列的值为“Complete”的列表内Item。

ViewFields

此元素定义返回哪些Fields(列表的列)也就是说定义了作为搜索结果的DataTable将包含哪些列(Column)。比如:
              <FieldRef Name="Title" Nullable="TRUE" />

①    Name (例:<FieldRef Name="Title" />)

这里的"Name"并不是那些我们列表中能看到的列名,而是该列的内部命。

②    Nullable (例:<FieldRef Name="Title" Nullable="TRUE" />)。

Nullable属性为可选项。我们知道在MOSS里并不是所有的列表都包含了相同的列。比如SPSiteDataQuery在查询一个列表时,发现ViewFields里指定的某个列在列表里并不存在,那么这个列表将被忽略。而当指定了" Nullable "为"TRUE"时则可以避免这种情况,不管有没有这个列,该类表都会被查询,只是在返回的DataTable里该列将呈现空白。

Query

在这个属性里可以设置检索条件以及为结果排序。这个属性的功能就像一个SQL语句。讲起来要讲半天。还是让我们来看几个例子,有SQL基础的应该很快能够领会。(语法参照 附录2)

RowLimit

定义返回行数。
    例: q.RowLimit = 10;

使用SPSiteDataQuery对象搜索会有几个问题;

1、如果要搜索的栏目名称被改过,搜不到;

  用SPSiteDataQuery对象进行列表搜索的列表肯定是有公共的字段的,比如都有“合同编号”这个字段。

  如果其中的某个列表的“合同编号”是由其他的字段修改而来的就会出现问题,使用SPSiteDataQuery会搜不到这个列表。

  例如:“标题”内部名称为“Title”,如果需求变更“标题”改成“合同编号”。他的内部名称并没有变还是“Title”,而其他列表的“合同编号”字段的内部名称为“_x5408__x540c__x7f16__x53f7_”。

如果按照下面这段查询语句进行查询,那么那个有“标题”改成“合同编号”的列表就不会被搜索到。

  <Where><Eq><FieldRef Name="x5408__x540c__x7f16__x53f7_"/><Value Type="Text">2010_1_2_213</Value></Eq></Where>

2、SPSiteDataaQuery对象没有分页功能。如果想要分页就必须把所有的数据都搜索出来,然后进行分页操作。所有数据都搜索出来会很占内存空间。

最后还是使用SPQuery方法遍历所有的列表进行搜索。

 /// <param name="webUrl">合同列表所在网站</param>
        /// <param name="listNames">所有的合同列表名称</param>
        /// <returns></returns>
        public List<SearchResultModel> GetDataEachListBianGeng(string webUrl, Dictionary<string, string> listNames)
        {
            int pageSize = 30;//页面大小
            int pageIndex = AspNetPager1.CurrentPageIndex;
            AspNetPager1.PageSize = pageSize;
            int pageCount = 0;//为aspnetpager分页使用的
            int flagPages = 0;//为了标记要获取的项目

            List<SearchResultModel> PageData = new List<SearchResultModel>();
            using (SPWeb web = SPContext.Current.Site.OpenWeb(webUrl))
            {
                foreach (var item in listNames)
                {
                    SPList list = web.Lists.TryGetList(item.Key);

                    if (list != null)
                    {
                        SPQuery query = new SPQuery();
                        query.RowLimit = 500;
                        query.Query = GetQuery(list);
                        SPListItemCollection items = null;
                        do
                        {
                            items = list.GetItems(query);
                            if (PageData.Count <= pageSize)
                            {
                                foreach (SPListItem listItem in items)
                                {
                                    flagPages += 1;
                                    if (flagPages > (pageSize * (pageIndex - 1)) && flagPages < (pageSize * pageIndex))
                                    {
                                        SearchResultModel srm = new SearchResultModel();
                                        srm.ContractID = (listItem["现合同编号"] ?? "").ToString();
                                        srm.ContractMoney = (listItem["合同价款变更后"] ?? "").ToString();
                                        srm.ContractName = (listItem["合同名称"] ?? "").ToString();
                                        srm.DuiFangCompany = (listItem["对方单位名称变更后"] ?? "").ToString();
                                        srm.TanPanRen = (listItem["合同主谈人员"] ?? "").ToString();
                                        srm.TitleUrl = web.Url + "/_layouts/listform.aspx?PageType=4&ListId=" + list.ID + "&ID=" + listItem.ID.ToString();
                                        PageData.Add(srm);
                                    }
                                }
                            }

                            pageCount += items.Count;//计算总页数
                            query.ListItemCollectionPosition = items.ListItemCollectionPosition;
                        } while (items.ListItemCollectionPosition != null);
                    }
                    else
                    {
                        SPDiagnosticsService.Local.WriteEvent(3, new SPDiagnosticsCategory("MSDN", TraceSeverity.Unexpected, EventSeverity.Information), EventSeverity.Information, "列表名:" + item.Key + ",未找到", "asdfasdf");
                    }
                }
            }

            AspNetPager1.RecordCount = pageCount;
            return PageData;
        }

时间: 2024-11-10 13:35:19

sharepoint搜索多个列表的相关文章

SharePoint 2010 快速隐藏列表项目的下拉菜单

SharePoint 2010 快速隐藏列表项目的下拉菜单 有时候为了不让一些用户编辑列表项,需要隐藏列表项目的下拉菜单.这里提供一个快速的方法,只需要增加一个内容编辑器控件,将css代码写入其HTML源即可. 修改前: 修改后: CSS代码: <style type="text/css"> .s4-ctx{ display:none; } </style> SharePoint 2010 快速隐藏列表项目的下拉菜单,布布扣,bubuko.com

SharePoint 2013/2010 在一个列表或文档库内移动列表项,文档和目录位置而保持last modify by 等系统字段保持不变

本文讲述SharePoint 2013/2010 在一个列表或文档库内移动列表项.文档和目录位置而保持last modify by 等系统字段保持不变的解决方式. 近期遇到客户一个需求,在一个列表或文档库内移动列表项,文档和目录位置而保持last modify by 等系统字段保持不变. 研究出来了.不敢独享.特此共享出来给同鞋们做參考: using Microsoft.SharePoint; using System; using System.Collections.Generic; usi

SharePoint CAML判断一个列表项是否有附件

<Eq>               <FieldRef Name='Attachments' />               <Value Type='Attachments'>1</Value>            </Eq> SharePoint CAML判断一个列表项是否有附件,布布扣,bubuko.com

SharePoint 搜索功能失效

今天继续跟大家分享一个 SharePoint的故障问题,是关于 SharePoint 搜索功能失效的一个问题. 有一天,我们突然发现,SharePoint 2016的搜索功能无法使用了,如下图 然后在服务器的系统日志里面看到了大量的报错. 其实遇到这个问题,我们第一时间都会想到先去检查 Search 服务 我们打开计算机的 services.msc 服务管理面,查看下面两项服务是否启动. 然后登陆SharePoint 管理控制台来查看应用服务 检查一下 Search Service Applic

ECSHOP模糊分词搜索和商品列表关键字飘红功能

ECSHOP联想下拉框 1.修改page_header.lbi模版文件,将搜索文本框修改为: <input name="keywords" type="text" id="keyword" value="<!--{if ($search_keywords neq "")}{$search_keywords|escape}--><!--{else}-->ecshop<!--{/if}

SharePoint自动初始化网站列表

1,由于目前的SharePoint网站需要部署到多个服务器上,每个网站的内容都不一样,所以使用备份还原是不可以的.常用的方式便是将列表导出为列表模版,然后将列表模版复制到服务器上,根据列表模版创建列表.由于网站中的列表比较多,需要部署多套项目,这项工作就变成了很无聊的一项工作.因此通过编程的方式自动创建所有列表. 2,请看代码(我是用控制台程序创建的列表) (1)主函数 static void Main(string[] args) { SPSecurity.RunWithElevatedPri

sharepoint搜索配置问题

配置sharepoint 爬网内容源,如我们有4台前端服务器,集群域名为eds.jd.com,2台用于爬网前端服务器,集群域名为crawl.eds.jd.com 配置内容源的时候,将地址配为: 结果一直搜索不出任何数据,将地址改为crawl.eds.jd.com也不行. 最后没办法,将地址改为机器名,竟然能搜索出来数据,这是什么原因还不得知,但这样的架构不太适合大数据爬网. 继续深入研究,找找原因.

Qt 自动搜索串口号列表

@功能: SerialPortList 类实现当前可用的串口进行实时扫描,当发现有新的串口 或是现有串口消失时,SerialPortList类将发出一个QStringList类型的 信号onNewSerialPort,QStringList类型对象中存放当前可用的串口设备. @使用方法: 1.Qt版本需要高于5.1以上: 2.在新建Qt工程文件中时需要加入QSerialPort模块:即:在xxx.pro文件    中加入 Qt += serialport 3.在应用程序中定义一个曹,用于响应Se

搜索框提示列表问题

在实现如下功能的时候,当输入为aj的时候需要将下面的列表删除然后创建新的列表在将后台的数据导入列表 但是在删除列表的时候我写了如下代码: function clearLi(){ var content_ul = document.getElementById("moreword"); var ul_childs = content_ul.childNodes; var len = ul_childs.length; for(var i = 0; i < len; i++){ co