zoukankan      html  css  js  c++  java
  • 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;
            }
    复制代码
  • 相关阅读:
    笔记-归并排序
    Repeated Substring Pattern
    Assign Cookies
    Number of Boomerangs
    Paint Fence
    Path Sum III
    Valid Word Square
    Sum of Two Integers
    Find All Numbers Disappeared in an Array
    First Unique Character in a String
  • 原文地址:https://www.cnblogs.com/ningang/p/4321812.html
Copyright © 2011-2022 走看看