CrossListQueryInfo \ SpsitedataQuery如何跳过特定网格的项目?
-
10-12-2019 - |
题
客户希望从首页上的所有网站查看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); } } } }