2017-02-10 78 views
1

我想重構一個從DB中提取一些類型爲QuerySuggest的對象的類。使用Linq對從數據庫返回的對象進行兩個查詢。從兩個幾乎相同的Linq查詢中提取一個方法

很明顯,這兩個查詢幾乎完全相同,唯一的區別是在前者中我有一個附加條件:「& & e.UserId == request.UserId」。

這在我看來是一種代碼味道,我想重構它,但我不確定如何繼續。

這是代碼,我需要重構樣本:

IRepository<QuerySuggest> repository = _repositoryManager.GetRepository<QuerySuggest>(_repositoryType); 

     //entitiesByUser contains all the query suggest by the user 
     var entitiesByUser = repository.Query(c => c.Where(e => e.IdWebsite == request.WebSiteId && 
                 e.FulltextFree != null && 
                 e.DataOra >= (System.DateTime.Today.AddDays(-60).Date) && 
                 e.UserId == request.UserId) 
               .GroupBy(g => g.FulltextFree) 
               .Select(n => new { FulltextFree = n.Key, HowMany = n.Count() }) 
               .Where(w => w.HowMany >= request.HowMany) 
               .OrderBy(o => o.HowMany)) 
               .ToList(); 
     //entitiesByUser contains all the query suggest not from user 
     var nonUserEntities = repository.Query(c => c.Where(e => e.IdWebsite == request.WebSiteId && 
                 e.FulltextFree != null && 
                 e.DataOra >= (System.DateTime.Today.AddDays(-60).Date)) 
               .GroupBy(g => g.FulltextFree) 
               .Select(n => new { FulltextFree = n.Key, HowMany = n.Count() }) 
               .Where(w => w.HowMany >= request.HowMany) 
               .OrderBy(o => o.HowMany)) 
               .ToList(); 
+0

是'request'在兩種情況下,同一類型? – JLRishe

+0

是的,它是相同的類型 – davideAlbertini

回答

1

我相信這應該是做這件事:

IList<QuerySuggest> QuerySuggestions(
    RequestType request, 
    bool filterByUser = false, 
    bool excludeUser = false) 
{ 
    IRepository<QuerySuggest> repository = 
     _repositoryManager.GetRepository<QuerySuggest>(_repositoryType); 

    var entities = repository 
     .Query(c => c.Where(e => 
      e.IdWebsite == request.WebSiteId && 
      e.FulltextFree != null && 
      e.DataOra >= (System.DateTime.Today.AddDays(-60).Date) && 
      (!filterByUser || e.UserId == request.UserId) && 
      (!excludeUser || e.UserId != request.UserId) 
     ) 
     .GroupBy(g => g.FulltextFree) 
     .Select(n => new { FulltextFree = n.Key, HowMany = n.Count() }) 
     .Where(w => w.HowMany >= request.HowMany) 
     .OrderBy(o => o.HowMany)) 
     .ToList(); 

    return entities; 
} 

IList<QuerySuggest> QuerySuggestionsByUser(RequestType request) 
{ 
    return QuerySuggestions(request, filterByUser: true); 
} 

IList<QuerySuggest> QuerySuggestionsAnyUser(RequestType request) 
{ 
    return QuerySuggestions(request); 
} 

IList<QuerySuggest> QuerySuggestionsOtherUsers(RequestType request) 
{ 
    return QuerySuggestions(request, excludeUser: true); 
} 
+0

如果我需要'e.UserId == request.UserId'並且'e.UserId!= request.UserId'在另一箇中呢?邏輯表達式不再有效,我嘗試了許多不同的表達式,但沒有成功 – davideAlbertini

+0

@davideAlbertini在上面進行了更新。請試試看。 – JLRishe

+0

謝謝,它工作正常! – davideAlbertini

0

你可以寫,結合謂詞的方法。 @喬恩飛碟雙向提供了兩個這樣的方法在這裏:

Combine Multiple Predicates

您應該能夠使用它們像這樣:

Predicate<YourType> a = e => e.IdWebsite == request.WebSiteId && 
              e.FulltextFree != null && 
              e.DataOra >= (System.DateTime.Today.AddDays(-60).Date); 

Predicate<YourType> b = e => e.UserId == request.UserId; 

var entitiesByUser = repository.Query(c => c.Where(Helpers.And(a, b))); 
相關問題