Pregunta

El cliente quiere ver 10 artículos de noticias de todas las webs en la portada.

También el cliente quiere especificar algunas noticias que deberíamos saltar.

Estoy tratando de hacer lo siguiente:

var id =1; 

<Neq><FieldRef Name=\"ID\" /><Value Type=\"Counter\">" + id + "</Value></Neq>

Pero esta consulta se omitirá todas las noticias de todas las redes con ID= 1. Necesito especificar en la consulta desde qué Web debería saltarme noticias:

Por ejemplo:

!(id = 1 and webid=someId)

¿Cómo escribir dicha consulta CAML?

¿Fue útil?

Solución 2

Podemos agregar campos ocultos para ID de sitio y ID de Web a la lista.

Luego, en Events Reciever establece esos valores para cada nuevo artículo creado.

 private void UpdateHiddenFields(SPListItem item)
    {
        if (item.ContentType.Name == "MyContentType")
        {
            try
            {
                this.EventFiringEnabled = false;

                if (item != null)
                {
                    var isSiteChanged = UpdateGuidField(item, Constants.Lists.News.Fields.HiddenNewsSiteGUID, item.Web.Site.ID);
                    var isWebChanged = UpdateGuidField(item, Constants.Lists.News.Fields.HiddenNewsWebGUID, item.Web.ID);

                    if (isWebChanged || isSiteChanged)
                    {
                        item.SystemUpdate();
                    }
                }
            }
            catch (Exception ex)
            {
                LoggingService.WriteError(ex, "Cannot update hidden fields.");
            }
            finally
            {
                this.EventFiringEnabled = true;
            }
        }
    }

  private static bool UpdateGuidField(SPListItem item, string fieldName, Guid guidToSet)
        {
            if (item.Fields.ContainsField(fieldName))
            {
                var value = item[fieldName] as string;

                if (string.IsNullOrEmpty(value))
                {
                    item[fieldName] = guidToSet.ToString();
                    return true;
                }
                else
                {
                    var guid = value.ToGuid();

                    if (!guid.HasValue || guid.Value != guidToSet)
                    {
                        item[fieldName] = guidToSet.ToString();
                        return true;
                    }
                }
            }

            return false;
        }

Entonces podemos usar esos campos en consulta.

Otros consejos

EVGENY,

Parece ser un posible duplicado de estas preguntas:

¿Es posible filtrar los resultados de SpsiteDataQuyery por sitio?

Respuesta desde la publicación:

No creo que puedas hacer esto sin alguna forma de filtrado Post ha podido recuperar.Sin embargo, no es difícil.

Las consultas SPSEDEDAQUERY incluyen automáticamente datos en el DataTable para Listid y WebID, para que luego pueda filtrar su DataTable por web.Sé que no es idea: 'consulta y filtro', más bien que solo 'consulta', pero debería funcionar.

Las siguientes consultas para todos los documentos con ID= 1, y luego filtros para una web particular.Supongo que tu expresión del filtro sería más. complicado.

    using (SPSite site = new SPSite(url))
    {
        using (SPWeb web = site.OpenWeb())
        {
            SPSiteDataQuery q = new SPSiteDataQuery();
            q.Query = "<Where><Eq><FieldRef Name='ID' /><Value Type='Integer'>1</Value></Eq></Where>";
            q.Webs = "<Webs Scope='SiteCollection' />";
            q.Lists = "<Lists BaseType=\"1\" />";
            q.ViewFields = "<FieldRef Name='ID' /><FieldRef Name='FileLeafRef' />";

            DataTable table = web.GetSiteData(q);
            DataRow[] filteredRows = table.Select("WebId = '{282625A8-B13B-4DC0-B62E-D3255011FB5C}'");
            foreach (DataRow row in filteredRows)
            {
                foreach (DataColumn col in table.Columns)
                {
                    string colData = string.Empty;
                    if (row[col] != null)
                    {
                        colData = row[col].ToString();
                    }
                    Console.WriteLine("{0} : {1}", col.ColumnName, colData);
                }
            }
        }
    }

Licenciado bajo: CC-BY-SA con atribución
scroll top