2017-02-10 3 views
1

Ich versuche, eine Klasse, die aus einem DB einige Objekte des Typs QuerySuggest extrahieren. Mit Linq werden zwei Abfragen für die aus der DB zurückgegebenen Objekte durchgeführt.Eine Methode aus zwei, fast identischen Linq-Abfragen extrahieren

Es ist offensichtlich, dass die beiden Abfragen fast identisch sind, der einzige Unterschied ist, dass in ersterem habe ich eine zusätzliche Bedingung: "& & e.UserId == request.UserId".

Das scheint mir ein Code-Geruch, und ich möchte es umgestalten, aber ich bin mir nicht sicher, wie es weitergehen soll.

dies ist die Probe von Code, den ich ein Refactoring benötigen:

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

Ist 'request' die gleiche Art in beiden Fällen? – JLRishe

+0

ja, es ist der gleiche Typ – davideAlbertini

Antwort

1

Ich glaube, das einen Weg, es zu tun sein sollte:

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

Was ist, wenn ich 'e.UserId == request.UserId' in einem Fall und' e.UserId! = Request.UserId' in dem anderen haben muss? Der logische Ausdruck ist nicht mehr gültig, ich habe viele verschiedene Ausdrücke ohne Erfolg ausprobiert – davideAlbertini

+0

@davideAlbertini Ein Update oben durchgeführt. Bitte versuchen Sie es. – JLRishe

+0

Danke, es hat gut funktioniert! – davideAlbertini

0

Sie könnten eine Methode schreiben, die Prädikate kombiniert. @ Jon Skeet hat zwei solche Methoden, die hier zur Verfügung gestellt:

Combine Multiple Predicates

Sie sollten in der Lage sein, sie so etwas zu verwenden:

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