SPB-附录-查询条件类在SpaceBuilder中的作用

来自站长百科
跳转至: 导航、​ 搜索

导航: 上一页

在获取实体集合时情况较多:

例如:以文件为例,列出一些获取实体集合的情况:

  1. 只获取某个每个人的文件集合
  2. 获取每个标签下的文件集合
  3. 获取每个类别下的文件集合
  4. 获取某个页面的文件集合
  5. 获取私有的文件集合
  6. 获取某个人每隔标签下的文件集合
  7. 获取某个人每个类别下的文件集合
  8. 获取某个标签下某个页面的文件结合….

以上的情况,以及他们的组合将会产生很多种情况,而且这些情况是变化的;所以SpaceBuilder使用了查询条件类封装了这些变化;我们看一下文件查询条件类 - FileThreadQuery:

namespace SpaceBuilder.File
{
    /// <summary>
    /// 文件查询类
    /// </summary>
    public class FileThreadQuery
    {
        #region Query Properties
        /// <summary>
        /// 拥有者UserID
        /// </summary>
        public int OwnerUserID = -1;
        /// <summary>
        ///  站点类型
        /// </summary>
        public int SiteCategoryID = -1;
        …..
        …..
        private int pageIndex = 1;
        /// <summary>
        /// 当前显示的页码号
        /// </summary>

        public int PageIndex
        {
           ….
        }
        #endregion

        /// <summary>
        ///  缓存使用的标识键,在缓存体系中名称唯一,以区别于其他的缓存对象
        /// </summary>
        public string CacheKey
        {
            get
            {
return string.Format("FileThreads::OwnerUserID:

{0}-SiteCategoryID{1}-IncludeSiteCategoryDescendant{2}
-UserCategoryID:{3}-OnlyPublic:{4}-AuditingStatusForDisplay:

{5}-UncategorizedOnly:{6}-TagName:{7}-SubjectKeywords:
{8}-PI:{9}-PS:{10}-SO:{11}-SB:{12}-IP:{13}-MaxRecords:{14}-IncludeTags:{15}",

OwnerUserID,SiteCategoryID,IncludeSiteCategoryDescendant, UserCategoryID, OnlyPublic, 

AuditingStatusForDisplay.ToString(), UnuserCategorizedOnly, TagName, 
SubjectKeywords, PageIndex, PageSize, (int)SortOrder, 

(int)SortBy, EnablePaging, MaxRecords, IncludeTags);
            }
        }
    }
}

由于代码太多,只截取了部分内容,如上面的代码所示;实际FileThreadQuery包括哪些查询条件请看源码(File项目中的FileThreadQuery.cs);FileThreadQuery中的各个属性代表了各种查询条件,通过赋值不同的查询条件;实现不同查询条件的组合:例如,获取某个人某个标签下的文件集合:

FileThreadQuery query = new FileThreadQuery();
query.OwnerUserID = currentDomainUser.UserID;
query.TagName = tagName;
PagingDataSet<FileThread> threads = FileThreads.GetThreads(query);

也就是说,FileThreadQuery封装了各种查询条件以及他们的组合;在表现层,我们获取符合某些条件的文件集合只要配置查询条件类 FileThreadQuery即可。

大家可能注意到了,在FileThreadQuery中还有个特殊的属性:CacheKey:

/// <summary>
        ///  缓存使用的标识键,在缓存体系中名称唯一,以区别于其他的缓存对象
        /// </summary>

        public string CacheKey
        {
            get
            {
                return string.Format("FileThreads::OwnerUserID:

{0}-SiteCategoryID{1}-IncludeSiteCategoryDescendant{2}
-UserCategoryID:{3}-OnlyPublic:{4}-AuditingStatusForDisplay:

{5}-UncategorizedOnly:{6}-TagName:{7}-SubjectKeywords:{8}-
PI:{9}-PS:{10}-SO:{11}-SB:{12}-IP:{13}-MaxRecords:{14}-IncludeTags:{15}",

  OwnerUserID,SiteCategoryID,IncludeSiteCategoryDescendant, UserCategoryID, OnlyPublic, 

AuditingStatusForDisplay.ToString(), UnuserCategorizedOnly, 
TagName, SubjectKeywords, PageIndex, PageSize, (int)SortOrder, 

(int)SortBy, EnablePaging, MaxRecords, IncludeTags);
            }
        }

它不是查询条件,而是缓存标识;在从数据库中取出数据库后,为了减轻数据库的负担,我们将查询到得内容放入缓存;而不同的缓存块都有唯一标识相互区别,就是使用的FileThreadQuery中的这个CacheKey。

以上介绍了,为什么使用FileThreadQuery以及如何使用;那么,在数据访问层获取数据集合的时候FileThreadQuery是如何起作用的?获取文件集合的方法:GetThreads在类SqlFileThreadProvider中的实现:(解析FileThreadQuery,组装sql语句)

Spacebuilder0034.jpg

参考资料[ ]