Feb 062008
 

When you’re working with SharePoint, never assume that simple operations are cheap. Recently I was programming against the Discussion list, and wanted to track how many threads were in the list. In the discussion list, the thread is implemented in as list items in the list.Folders property (which exposes list items of course… love that this property is called "folders"!). To populate my discussion list, I wrote a simple little console app that stuffed 10,000 threads and replies into the discussion list.

The method for adding lots of items looks like this: (NOTE: This sample only work for discussions!)

private static void AddLotsOfItems(SPList list, int count, int replycount)
{
    for (int i = 0; i < count; i++)
    {
        SPListItem discussion = SPUtility.CreateNewDiscussion(list.Items, i.ToString() + "– Item by Code");
        discussion[SPBuiltInFieldId.Body] = "all your base are belong to me.";
        discussion.Update();

        for (int ii = 0; ii < replycount; ii++)
        {
            SPListItem reply = SPUtility.CreateNewDiscussionReply(discussion);
            reply[SPBuiltInFieldId.Body] = "i know kung fu. " + ii;
            reply.Update();
        }
    }
}

 

I then noticed that accessing the property list.Folders.Count took a ridiculously long time with that much data. To solve this, I implemented a cache method that takes a delegate to read an object from the list and cache it. That method is below. Keep in mind however that this example caches the data globally, and user permissions could be different– so you’re going to want to modify this example for your own use. (Please, always write authorization aware code!)

public delegate object GetValue(SPList list);

public static object GetCachedListValue(SPList list, string cachePrefix, GetValue getValueDelegate)
{
    object listValue = null;
    if (HttpContext.Current == null || HttpContext.Current.Cache == null)
        return null;

        object[] cacheArray = null;
        var cache = HttpContext.Current.Cache;
        string cacheKey = cachePrefix + list.ID.ToString();
        object threadCountBlob = cache[cacheKey];

        // Just for sanity…
        const int valueIndex = 0;
        const int lastModIndex = 1;

        if (threadCountBlob != null)
        {
            try
            {
                cacheArray = (object[])threadCountBlob;
                if (list.LastItemModifiedDate != (DateTime)cacheArray[lastModIndex])
                    // Reload the data!
                    cacheArray = null;
                else
                    listValue = cacheArray[valueIndex];
            }
            catch { cacheArray = null; }
        }
        if (cacheArray == null)
        {
            listValue = getValueDelegate(list);
            var cacheData = new object[] { listValue, list.LastItemModifiedDate };
            cache[cacheKey] = cacheData;
        }           
    return listValue;
}

 

With this in place, you can then use the following code to get the expensive data– which will be cheap after the first time. The call will be expensive on each first call after the data is updated– so you will want to factor in the frequency of the list update as well as the security of the data involved when using this.

int? count = (int?)GetCachedListValue(list, "folders,Count-",
      delegate(SPList thelist) { return thelist.Folders.Count; });

With this method, you can cache any value from the list. Using the list.LastItemModifiedDate with cache keys (including client and server caches!) can greatly improve your custom application’s performance.

  13 Responses to “Caching Metadata on a SharePoint List”

  1. htrgrss wow gold wow powerleveling 安全阀 减压阀 疏水阀 电动阀 调节阀 氨用阀门 进口轴承 SKF轴承 wow gold world of warcraft gold buy wow gold buy world of warcraft gold cheap wow gold cheap world of warcraft gold wow power leveling wow power level world of warcraft power leveling world of warcraft power level ffxi gil lineage 2 adena eve isk eve online isk buy eve isk cheap eve isk eq2 gold eq2 plat guild wars gold wow account buy wow account world of warcraft account buy world of warcraft account maple story mesos buy maple story mesos cheap maple story mesos lotr gold buy lotr gold

  2. lotro gold lord of the rings gold lord of the rings online gold lotro gold lord of the rings gold lord of the rings
    online gold Warhammer gold
    Warhammer online gold Warhammer money War gold War money Tabula Rasa Credit lotro gold lord of the rings gold lord of the rings online gold lord of the
    rings online gold lord of the rings
    gold Tabula Rasa Credit World of Warcraft gold PotBS Doubloon Pirates of the
    Burning Sea Doubloon PotBS Gold Pirates of the Burning Sea
    Gold lotro gold lord of the rings gold lord of the rings online gold Tabula Rasa Credit Warhammer gold Warhammer online gold PotBS Doubloon PotBS gold Pirates of the Burning Sea
    gold Pirates of the
    Burning Sea Doubloon

  3. 看護  資格  住宅  服飾 学校  為替  クレジットカード 現金化  美容院  ヘアスタイル  システムキッチン  医院開業  悩み 相談  転職  中高年 転職  競馬予想  ブライダル  ウェディング  結婚式  ショッピング枠 現金化  FX  外為  システムキッチン  インプラント  ブライダル  ウェディング  結婚式  外国為替 為替  FX  インテリア 雑貨  不動産 東京  東京 土地  東京 一戸建て  ペアリング  盲導犬  競馬予想  ショッピング枠 現金化  出会い系  現金化  ショッピング枠 現金化 
    クレジットカード 現金化  格安航空券  クレジットカード 現金化  出会い系  副業  美容整形  バイク買取  通信制高校  子犬 東京  子犬 神奈川  ペットショップ 東京  ペットショップ 神奈川  アルバイト 求人情報  求人情報  アルバイト  不動産担保ローン  格安国内航空券  引越  韓国ツアー  沖縄旅行  ダイビング

  4. ECサイト構築   ウィークリーマンション
    治験 結婚指輪
    太陽光発電 結婚式 演出 吉原 ソープ
    債務整理
     害虫駆除 法律事務所 求人 看護師
     キャッシング
    転職 バイアグラ ショッピング枠 現金化  釣り 釣具
    別れさせ屋 価格   賃貸 
    不動産担保ローン  介護 看護師   会社設立   横浜中華街 ウェディングドレス  ウェディング
    カラコン 
    メル友 ウィークリーマンション
    自動車ガラス  不動産 ダイビング
     葬儀 東京ショッピング枠 現金化  データ復旧  テレマーケティング  RAID復旧 データ復元 データ復旧

      

  5. ダイビング  沖縄旅行  韓国ツアー  格安国内航空券  不動産担保ローン  アルバイト  求人情報  ペットショップ 神奈川  ペットショップ 東京  子犬 神奈川  子犬 東京  バイク買取  美容整形  副業  手形割引  出会い系  格安航空券  出会い系

  6. FX  為替  外国為替  結婚式  ウェディング  ブライダル  インプラント  システムキッチン  インテリア 雑貨  FX  外為  結婚式  ウェディング  ブライダル  競馬予想  医院開業

  7. 有料老人ホーム  転職  悩み 相談  為替  住宅  資格  東京 土地  不動産 東京  競馬予想  盲導犬  ペアリング  東京 一戸建て 

  8. 引越   アルバイト 求人情報   クレジットカード 現金化  ショッピング枠 現金化  クレジットカード 現金化  現金化  ショッピング枠 現金化  外国為替  ショッピング枠 現金化  クレジットカード 現金化  中高年 転職  看護

  9. 包茎など男の悩み・包茎手術相談なら泌尿器科・形成外科 の大阪梅田中央クリニック

  10. 結婚式 演出
    太陽光発電 介護 転職
     会社設立データ復旧   釣り 釣具
    ウィークリーマンション  株式投資 害虫駆除  看護師  キャッシング テレマーケティング治験
    バイアグラ 看護師   横浜中華街
    結婚指輪  ウェディング  メル友
    ウィークリーマンション 不動産

  11. ショッピング枠 現金化 RAID復旧 データ復元  データ復旧 手掌多汗症 手 汗   メタボ対策  データ復旧  不動産担保ローン 海外推广  国际推广   网络营销  
    网络推广 バイアグラ  横浜 賃貸  データ復旧   RMT 価格   賃貸 カラコン 

  12. fg28yt gtg07y wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold 泵 泵 泵 泵 水泵 水泵 水泵 水泵 水泵 齿轮输油泵 齿轮输油泵 环保设备 环保设备 China Travel China Tours China Tours beijing Tours beijing Tours beijing Travel beijing Travel shanghai Tours shanghai Tours shanghai Travel shanghai Travel wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold wow gold 环保设备 环保设备 环保设备

  13. アダルトグッズ アダルトグッズ アダルトグッズ アダルトグッズ 大人のおもちゃ 大人のおもちゃ 大人のおもちゃ 大人のおもちゃ 

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>