客户希望从首页上的所有网站查看10个新闻。

客户也希望指定一些我们应该跳过的消息。

我想做下一件事:

var id =1; 

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

但此查询将跳过所有具有ID= 1的所有网络的新闻。我需要在我应该跳过新闻的Query中指定:

例如:

!(id = 1 and webid=someId)
.

如何编写此类CAML查询?

有帮助吗?

解决方案 2

我们可以为网站ID和Web ID添加隐藏的字段以列出。 然后在事件中,Reciever为每个新创建的项目设置这些值。

 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;
        }
.

然后我们可以使用查询中的这些字段。

其他提示

EVGENY,

似乎是这个问题可能的副本:
通过网站过滤spsitedataquery结果吗?

从帖子中答案:

我不认为你可以在没有某种形式的过滤帖子的情况下做到这一点 拿来。但是,它并不难。

spsitedataquery查询自动包含DataColumns DataTable for ListId和WebID,因此您可以过滤您的 数据由web。我知道这不是想法 - '查询和过滤',相反 而不是'查询' - 但它应该工作。

具有id= 1的所有文档的以下查询,然后筛选到 特定的网络。我猜你的过滤表达将更多 复杂。

    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);
                }
            }
        }
    }
.

许可以下: CC-BY-SA归因
scroll top