2017-02-10 14 views
1

DBから抽出するクラスを、QuerySuggest型のオブジェクトを抽出するためにリファクタリングしようとしています。 Linqを使用して、DBから返されたオブジェクトに対して2つのクエリが行われます。ほとんど同じ2つのLinqクエリからメソッドを抽出します。

2つのクエリがほぼ同一であることは明らかですが、唯一の違いは前者には追加の条件 "& & 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

あなたは述語を組み合わせた方法を書くことができます。 @ジョンスキートはここ2つの、このような方法を提供しています

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))); 
関連する問題