2

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

「基準値を null または空にすることはできません。IsNull プロパティを設定して null を検索します。」という例外がスローされます。

何か案は?

4

4 に答える 4

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 に設定せずに空の文字列値を検索することはできません。これは、DB コマンドを構築してフォーマットする EPiServer.DataAccess.PropertySearchDB.ExecuteCriteria メソッドに渡されます。IsNull が true であるため、netPropertySearchNull ストアド プロシージャが使用されます。文字列を検索するには、netPropertySearchString ストアド プロシージャを使用する必要があります。

  if (criteria.IsNull && !PageDB.IsMetaData(criteria.Name))
  {
    cmd.CommandText = "netPropertySearchNull";
  }

私の提案は、ページの完全なリストをロードし、linq を使用してフィルタリングすることです。または、API をバイパスして直接 DB クエリを実装することを検討するか、低レベルの EPiServer データ アクセス メソッドを使用することもできます (推奨されません)。

私の最初の答えをお詫びします-投稿する前にコードをテストする必要があります:)

于 2012-01-16T12:23:25.537 に答える
0

ページに、保存イベントで設定された非表示の bool プロパティ「Property X contains a value」があるものを見てきました。

次に、その bool プロパティが、本当に関心のあるものの代わりに PropertyCriteria として使用されます。

于 2012-08-23T07:13:26.343 に答える
-2

空の値を見つけるには、PropertyCriteria でIsNullプロパティを指定し、Equal 比較条件を使用する必要があります。

例えば

var criterias = newPropertyCriteriaCollection
{
  new PropertyCriteria()
  { 
    Condition = CompareCondition.NotEqual, 
    Name = "MyProperty", 
    IsNull = true, 
    Type = PropertyDataType.String
  }
};
于 2012-01-12T09:28:37.623 に答える