2016-06-21 14 views
1

Sitecoreの2つのフィールドを比較するコードで検索述語を作成しようとしていますが、奇妙なエラーメッセージが表示されています。基本的には、FirstPublishDate(コンテンツアイテムが最初に公開された日付)とLastPublishDate(コンテンツアイテムが最後に公開された日付)の2つの日付フィールドが各コンテンツアイテムにあります。 LastPublishDateが特定の日付範囲内にあり、LastPublishDateがFirstPublishDateと等しくないすべてのコンテンツアイテムを検索したいと思います。上記の述語は、このメソッドに渡される」として:ここでのLINQを使用すると、以下のようにその後、私は、検索を実行するために、私の一般的なサイトの検索コードでこの述語を使用...Sitecore 7.5の検索述語で2つのフィールドを比較できないのはなぜですか?

protected Expression<Func<T, Boolean>> getDateFacetPredicate<T>() where T : MySearchResultItem 
    { 
     var predicate = PredicateBuilder.True<T>(); 

     foreach (var facet in myFacetCategories) 
     { 
      var dateTo = System.DateTime.Now; 
      var dateFrom = dateTo.AddDays(facet.Value*-1); 

      predicate = predicate.And(i => i.LastPublishDate.Between(dateFrom, dateTo, Inclusion.Both)).And(j => j.LastPublishDate != j.FirstPublishDate); 
     } 
     return predicate; 
    } 

述語を生成するための私の方法であり、 additionalWhere "パラメータを使用します。私は私がそれぞれに2つの異なるフィールドを比較しようとしていますことを好きではないように思われるエラーメッセージについて理解することができるものから

Server Error in '/' Application. 

No constant node in query node of type:  'Sitecore.ContentSearch.Linq.Nodes.EqualNode'. Left:  'Sitecore.ContentSearch.Linq.Nodes.FieldNode'. Right:  'Sitecore.ContentSearch.Linq.Nodes.FieldNode'. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NotSupportedException: No constant node in query node of type: 'Sitecore.ContentSearch.Linq.Nodes.EqualNode'. Left: 'Sitecore.ContentSearch.Linq.Nodes.FieldNode'. Right: 'Sitecore.ContentSearch.Linq.Nodes.FieldNode'. 

Source Error: 


Line 548:    FacetResults resultFacets = null; 
Line 549:    if (facets != null && facets.Any()) { 
Line 550:     resultFacets = facets.Aggregate(query, (current, fname) => current.FacetOn(i => i[fname])).GetFacets(); 
Line 551:    } 
Line 552:    // calling this before applying facetFilter should allow us to get a total facet set 

:私はこれをしようとすると、私は、次のエラーメッセージが表示されます

public static SearchResults<T> GeneralSearch<T>(string searchText, ISearchIndex index, int currentPage = 0, int pageSize = 20, string language = "", IEnumerable<string> additionalFields = null, 
     Expression<Func<T, Boolean>> additionalWhere = null, Expression<Func<T, Boolean>> additionalFilter = null, IEnumerable<string> facets = null, 
     Expression<Func<T, Boolean>> facetFilter = null, string sortField = null, SortDirection sortDirection = SortDirection.Ascending) where T : SearchResultItem { 

     using (var context = index.CreateSearchContext()) { 
      var query = context.GetQueryable<T>(); 
      if (!string.IsNullOrWhiteSpace(searchText)) { 
       var keywordPred = PredicateBuilder.True<T>(); 

       // take into account escaping of special characters and working around Sitecore limitation with Contains and Equals methods     
       var isSpecialMatch = Regex.IsMatch(searchText, "[" + specialSOLRChars + "]"); 
       if (isSpecialMatch) { 
        var wildcardText = string.Format("\"*{0}*\"", Regex.Replace(searchText, "([" + specialSOLRChars + "])", @"\$1")); 
        wildcardText = wildcardText.Replace(" ", "*"); 
        keywordPred = keywordPred.Or(i => i.Content.MatchWildcard(wildcardText)).Or(i => i.Name.MatchWildcard(wildcardText)); 
       } 
       else { 
        keywordPred = keywordPred.Or(i => i.Content.Contains(searchText)).Or(i => i.Name.Contains(searchText)); 
       } 

       if (additionalFields != null && additionalFields.Any()) { 
        keywordPred = additionalFields.Aggregate(keywordPred, (current, field) => current.Or(i => i[field].Equals(searchText))); 
       } 
       //query = query.Where(i => (i.Content.Contains(searchText) || i.Name.Contains(searchText))); // more explicit call to check the content or item name for our term 
       query = query.Where(keywordPred); 
      } 

      if (language == string.Empty) { 
       language = Sitecore.Context.Language.ToString(); 
      } 

      if (language != null) { 
       query = query.Filter(i => i.Language.Equals(language)); 
      } 

      query = query.Page(currentPage, pageSize); 

      if (additionalWhere != null) { 
       query = query.Where(additionalWhere); 
      } 

      if (additionalFilter != null) { 
       query = query.Filter(additionalFilter); 
      } 

      query = query.ApplySecurityFilter(); 

      FacetResults resultFacets = null; 
      if (facets != null && facets.Any()) { 
       resultFacets = facets.Aggregate(query, (current, fname) => current.FacetOn(i => i[fname])).GetFacets(); 
      } 
      // calling this before applying facetFilter should allow us to get a total facet set 
      // instead of just those related to the current result set 
      // var resultFacets = query.GetFacets();  

      // apply after getting facets for more complete facet list 
      if (facetFilter != null) { 
       query = query.Where(facetFilter); 
      } 

      if (sortField != null) 
      { 
       if (sortDirection == SortDirection.Ascending) 
       { 
        query = query.OrderBy(x => x[sortField]); 
       } 
       else 
       { 
        query = query.OrderByDescending(x => x[sortField]); 
       } 
      } 

      var results = query.GetResults(); // this enumerates the actual results 
      return new SearchResults<T>(results.Hits, results.TotalSearchResults, resultFacets); 
     } 
    } 

フィールドを定数と比較するのではなく、他のものを使用します。もう1つの奇妙な点は、エラーが、ファセットを集約することと関連したコード行を指しているように見えることです。私はGoogleの検索を行い、このエラーに関係することはまったくありませんでした。何か案は?

おかげで、 コーリー

答えて

3

私が何をしようとしていることは可能ではないと思うし、あなたがthisを見れば、それは確かにケースかもしれません。そこに与えられている解決策は、あなたのロジックをインデックスに入れることです:あなたの日付をチェックし、検索可能な値を単純なブール値にすることができるComputedFieldを作成します。 ロジックを分割する必要があります。日付範囲のクエリは(現在の日付との関係で)述語で実行できますが、最初と最後の比較はクエリではなくインデックス時間に行う必要があります時間。

関連する問題