2016-11-07 1 views
0

Ich möchte Daten im Zusammenhang mit Sätzen unterschiedlicher Kombinationen erhalten.So erhalten Sie Daten im Zusammenhang mit Sätzen unterschiedlicher Kombinationen dynamisch

EX:

Wenn ich Tabelle: EmployeeLocation

empNum locationId extensionId year 

534  CX1   AX   2015 
534  LM1   RQ   2015 
677  LM1   ST   2015 

Res: 534,2015

Jetzt habe ich alle Mitarbeiter abfragen möchten, die in Lage waren (CX1 AND LM1) beide von ihnen in 2015. Vielleicht wechsle ich die Kombination (CX1 AND LM1 AND LR3) ... usw.


Wie so etwas machen dynamische Kombination. Entsprechend der Benutzereingabe für den Satz der Standortkombination.

+0

@IvanStoev 'Contains' =' IN' und das ist nicht das, was ich will, ich will 'CX1 UND LM1' zum Beispiel –

+0

Ich bin nicht sicher, was die Frage fragt ... Ist diese Suche eines dynamischen Abfrage? – JDavila

+1

@AnynameDonotcare Ja, ich habe festgestellt, dass direkt nach dem Posten des Kommentars der Kommentar entfernt wurde. Welches ORM verwendest du - EF oder? –

Antwort

1

Ein Ansatz, der Sie mit Linq ist die folgende verwenden können.

Angenommen, Sie eine Klasse wie folgt:

private class EmployeeLocation { 
    public int EmpNum {get; set;} 
    public string LocationId {get; set;} 
    public string ExtensionId {get; set;} 
    public int Year {get; set;} 
} 

Sie eine Methode erstellen können, die die Suche basierend auf den Parametern in Eingang behandelt:

public IEnumerable<EmployeeLocation> Search(
    int[] empNumArray, 
    string[] locationIdArray, 
    string[] extensionIdArray, 
    int[] yearArray){ 

    IEnumerable<EmployeeLocation> result = EmployeeLocationList; 
    if (empNumArray != null){ 
     foreach(var empNum in empNumArray){ 
      result = result.Where(r => r.EmpNum == empNum); 
     } 
    } 
    if (locationIdArray != null){ 
     foreach(var locationId in locationIdArray){ 
      result = result.Where(r => r.LocationId); 
     } 
    } 
    if (extensionIdArray != null){ 
     foreach(var extensionId in extensionIdArray){ 
      result = result.Where(r => r.ExtensionId == extensionId); 
     } 
    } 
    if (yearArray != null){ 
     foreach(var year in yearArray){ 
      result = result.Where(r => r.Year == year); 
     } 
    } 
    return result; 
} 
+0

Enthält = in und ich will nicht (oder) Ich möchte (und) –

+0

@AnynameDonotcare siehe meine aktualisierte Antwort – user449689

+0

Ein und derselbe Wert (zB 'r.LocationId') kann nicht gleich mehreren anderen Werten sein (was Ihre Array-Schleifen erzeugen), so dass das Ergebnis immer leer ist . –

0
DECLARE 
    locationId VARCHAR(3); 
    year INTEGER; 

BEGIN 
    EXECUTE IMMEDIATE  

    'SELECT empNum FROM EmployeeLocation 
    WHERE locationId = CX1 AND locationId = LM1 AND year = 2015'; 
END; 

Dies könnte eine einfache Möglichkeit zur Beschreibung der Abfrage sein. Ich denke, der Rest, der benötigt wird, ist ein Event-Handler, um anzugeben, welche locationId verwendet werden soll.

Hier ist detaillierter:

CREATE OR REPLACE PROCEDURE empNum(locId VARCHAR(3), yr VARCHAR(4)) IS 
    TYPE cur_typ IS REF CURSOR; 
    c cur_typ; 
    locationId VARCHAR(3); 
    year INTEGER; 
BEGIN 
    EXECUTE IMMEDIATE  

    'SELECT empNum FROM EmployeeLocation 
    WHERE locationId = locId AND locationId = locId AND year = yr'; 
END; 

Ich denke, mit cur_type als Referenz-Cursor für eine Abfrage-String verwendet werden könnte.

Quelle: https://docs.oracle.com/cd/A97630_01/appdev.920/a96590/adg09dyn.htm

1

Wie wäre jede Bedingung überprüft und dann die Schnittmenge der Ergebnisse nehmen?

public IEnumerable<int> Search(IEnumerable<Employee> employees, IEnumerable<Condition> conditions) { 
     var subresults = new List<IEnumerable<int>>(); 
     IEnumerable<int> result = null; 
     foreach (var condition in conditions) { 
      subresults.add(employees.Where(e => e.CheckCondition(condition)).Select(e => e.EmpNum)); 
     } 
     foreach (var subresult in subresults) { 
      if (result == null) { 
       result = subresult; 
      } else { 
       result = result.Intersect(subresult) 
      } 
     } 
     return result; 
    } 
Verwandte Themen