Можно ли улучшить этот запрос на получение размера документа в Sharepoint 2007?

Что ж, поскольку я относительно новичок в Sharepoint 2007, я хотел бы улучшить свой способ написания кода для этой платформы и уточнить некоторые привычки, которые у меня уже есть.

В следующем коде я задаю вопрос о размере документа, который находится в списке «Документы», но у меня создается впечатление, что я создаю множество объектов для доступа к информации. Разве нет возможности сразу перейти к документу (мне нужно получить доступ к de spweb, затем к списку, а затем к документу)?

Одна из вещей, которые я хочу улучшить, - это не использовать oSPWeb.Lists [0], который соответствует oSPWeb.Lists ["Documents"], ни один из них меня не убеждает, потому что этот список можно назвать "Documentos", o "Documents " и т.д...

Пожалуйста, не могли бы вы улучшить этот код?

System.Text.StringBuilder oSb = new System.Text.StringBuilder();

               oSb.Append("     <Where>");
        oSb.Append("         <Eq>");
        oSb.Append("              <FieldRef Name=\"FileLeafRef\" />");
        oSb.Append("              <Value Type=\"Text\">"+documento+"</Value>");
        oSb.Append("         </Eq>");
        oSb.Append("     </Where>");
        oSb.Append("    <ViewFields>");
        oSb.Append("         <FieldRef Name=\"FileSizeDisplay\" />");
        oSb.Append("    </ViewFields>");    

        string sResult = oSb.ToString();

        bool Existe = false;
        SPSite sps = null;
        SPWeb oSPWeb = null;
        SPList oList = null;
        SPListItemCollection col = null;

        try
        {
            sps = SPContext.Current.Site;
            using(oSPWeb = sps.OpenWeb(url))
            {
                oList = oSPWeb.Lists[0];
                SPQuery qry = new SPQuery();
                qry.Query = sResult;

                col=oList.GetItems(qry);
            }
        }

        catch { }

        if (col != null)
        {

            //return col[0].File.Length.ToString();
            return col[0]["FileSizeDisplay"].ToString();
        }
        else
        {
            return null;
        }

person netadictos    schedule 11.03.2009    source источник


Ответы (2)


Скорее всего, вам понадобится знать имя, индекс или идентификатор библиотеки документов, потому что на одном сайте может быть несколько библиотек документов. Таким образом, имя может храниться где-то в месте конфигурации (может быть другой список с парами имя-значение), но в конце вам придется сделать что-то вроде web.Lists ["имя списка"] (или идентификатор списка - I Избегал индексации списка).

Использование запроса CAML (который вы делаете) - это типичный способ выбора нескольких элементов из списка / библиотеки. Моя единственная рекомендация - не предполагать, что в коллекции будет хотя бы один элемент, если коллекция не равна нулю. Так что вместо:

if (col != null)

Я бы сделал:

if (col != null && col.Count > 0)
person Kirk Liemohn    schedule 11.03.2009
comment
Если вы храните информацию о том, как получить список, вам следует сохранить URL-адрес и вместо этого использовать web.GetList (url). Для получения дополнительной информации прочтите Сценарий 1: blogs.msdn.com/sowmyancs/archive/2008/10/26/ - person JMD; 12.03.2009

Наконец, я улучшил код, следуя советам Кирка и JMD: url http://blogs.msdn.com/sowmyancs/archive/2008/10/26/best-practices-sharepoint-object-model-for-performance-tuning.aspx - действительно хорошее начало для оптимизации кода:

System.Text.StringBuilder oSb = new System.Text.StringBuilder();

            oSb.Append("     <Where>");
            oSb.Append("         <Eq>");
            oSb.Append("              <FieldRef Name=\"FileLeafRef\" />");
            oSb.Append("              <Value Type=\"Text\">"+document+"</Value>");
            oSb.Append("         </Eq>");
            oSb.Append("     </Where>");
            oSb.Append("    <ViewFields>");
            oSb.Append("         <FieldRef Name=\"FileSizeDisplay\" />");
            oSb.Append("    </ViewFields>");            

            string sResult = oSb.ToString();

            SPSite sps = null;
            SPWeb oSPWeb = null;
            SPList oList = null;
            SPListItemCollection col = null;

            try
            {
                sps = SPContext.Current.Site;
                using(oSPWeb = sps.OpenWeb(url))
                {
                    //oList = oSPWeb.Lists[0];
                    oList=oSPWeb.GetList(oSPWeb.Url + "/" + listName);
                    SPQuery qry = new SPQuery();
                    qry.Query = sResult;

                    col=oList.GetItems(qry);
                }
            }

            catch { }

            if (col != null && col.Count > 0)
            {
                return col[0]["FileSizeDisplay"].ToString();
            }
            else
            {
                return null;
            }
person netadictos    schedule 12.03.2009