2017-12-14 6 views
0

Ich bin in einer Situation, in der ich keine neuen Parameter zu einer Methode hinzufügen kann, und kann nicht die Logik von DataQuery entweder ändern - so kann ich nur den Inhalt der Methoden mit einer ähnlichen Konstruktion wie folgt ändern und die Eigenschaften von T.Abfangen und überschreiben where-Klausel von linq

IEnumerable<T> Get<T>(DataQuery<T> query) { 
    var collection = repo; 
    return query.Apply(repo).ToList(); 
} 

Mein Problem ist, dass ich Unterstützung hinzufügen möchte Ts an meinem Team für das Abrufen zugewiesen, oder meine Firma oder einfach nur mich, aber ich habe keinen Zugang zu jedem Kontext von „me "vom Aufrufpunkt aus - sie sind im UserContext in den Methoden verfügbar.

Die DataQuery<T>.Apply() ermöglicht mir, Ts Eigenschaften wie T.caseId <= 4 abzufragen und wird eine Liste mit Fällen 1-4 zurückgeben. die übersetzt werden in source.Where(t => t.caseId <= 4)

Meine Idee ist es, die folgenden Felder hinzufügen T

bool IsMineQuery 
bool IsMyTeamQuery 
bool IsMyCompanyQuery 

und dann abfangen die Anrufe zu .Where(t => t.IsMineQuery == true) oder .Where(t => t.IsMyTeamQuery == true) und schreiben sie .Where(t => t.UserId == UserContext.UserId) oder .Where(t => UserContext.TeamIds.Contains(t.TeamId)) aber ich habe keine Ahnung, wie man Abfangen der Anrufe.

Wie erreiche ich das?

+0

Ich habe Ihre Frage vielleicht nicht vollständig verstanden, aber sollte 'bool IsMineQuery {get {return UserId == UserContext.UserId}}' genügen? – Heinzi

+0

@Heinzi Nein, weil 'UserContext' nicht im' IsMyQuery' Getter verfügbar ist. – dasblinkenlight

+1

Was ist 'DataQuery '? Hast du Kontrolle darüber? Wie konstruierst du und die Abfrage? –

Antwort

0

Also nachdem ich die ganze Nacht fummelt hatte ich einen Durchbruch.

Ich hatte eine benutzerdefinierte Abfrage-Provider zu machen - ich dieses Tutorial: https://msdn.microsoft.com/en-us/library/bb546158.aspx

dann meine Controller sind

der Form
IEnumerable<T> Get<T>(DataQuery<T> query) { 
    var collection = new MyQueryable(repo, UserContext); 
    return query.Apply(repo).ToList(); 
} 

Dann habe ich das Tutorial des „InnerMostWhereFinder“ änderte mein zu identifizieren, wenn Abfrage hat eine IsMineQuery oder IsMyTeamQuery erhalten und durch UserContext.TeamIds.Contain ersetzt (x => x.Team.Id) Funktioniert wie ein Charme, war aber keine direkte Lösung.

Verwandte Themen