仅限EPiServer:
如何在给定属性中搜索具有任何值的页面?我可以搜索属性中具有特定值的页面,但我无法弄清楚如何搜索“非空”。
例如,这不起作用:
var criterias = newPropertyCriteriaCollection
{
new PropertyCriteria()
{
Condition = CompareCondition.NotEqual,
Name = "MyProperty",
IsNull = false,
Type = PropertyDataType.String,
Value = ""
}
};
var pages = DataFactory.Instance.FindPagesWithCriteria(PageReference.StartPage, criterias);
抛出异常,“crieria值不能为null或为空。设置IsNull属性以搜索null。”
有什么想法吗?
答案 0 :(得分:1)
除非我错过了一个技巧,否则使用EPiServer PropertyCriteriaCollection似乎不可能。
我在反射器中进行了挖掘,这是我的发现。 FPWC方法最终调用EPiServer.DataAccess.PropertySearchDB.FastFindPagesWithCriteria()。
在此方法中如下:
foreach (PropertyCriteria criteria in criterias)
{
if (criteria.IsNull)
{
criteria.Value = null;
}
else if (string.IsNullOrEmpty(criteria.Value))
{
throw new EPiServerException("The crieria value cannot be null or empty. Set the IsNull property to search for null.");
}
...
}
因此,如果不将IsNull设置为true,则无法搜索空字符串值。然后将其反馈到EPiServer.DataAccess.PropertySearchDB.ExecuteCriteria方法,该方法构造并格式化DB命令。因为IsNull为true,所以使用netPropertySearchNull存储过程。搜索字符串需要使用netPropertySearchString存储过程。
if (criteria.IsNull && !PageDB.IsMetaData(criteria.Name))
{
cmd.CommandText = "netPropertySearchNull";
}
我的建议是加载完整的页面列表并使用linq过滤。或者,您可以考虑绕过API并实现直接数据库查询,或使用一些低级EPiServer数据访问方法(不推荐)
为我的第一个答案道歉 - 我真的应该在发布前测试代码:)
答案 1 :(得分:1)
是的,这令人困惑。如果其他人偶然发现了这个问题,请按照以下方法搜索具有某个PageReference属性的页面:
new PropertyCriteria()
{
createdCriteria.Name = "MyProperty";
createdCriteria.Type = PropertyDataType.PageReference;
createdCriteria.Condition = EPiServer.Filters.CompareCondition.NotEqual;
createdCriteria.Value = "0";
createdCriteria.IsNull = false;
}
答案 2 :(得分:0)
我已经看到某个页面有一个隐藏的bool属性“属性X包含一个值”,它在Saving事件中设置。
然后将该bool属性用作PropertyCriteria而不是您真正感兴趣的属性。
答案 3 :(得分:-2)
要查找空值,您需要在PropertyCriteria上指定IsNull 属性并使用Equal compare条件。
E.g
var criterias = newPropertyCriteriaCollection
{
new PropertyCriteria()
{
Condition = CompareCondition.NotEqual,
Name = "MyProperty",
IsNull = true,
Type = PropertyDataType.String
}
};