2016-10-12 1 views
0

USR_MSTR - Liste der Benutzer, die die AnwendungLINQ konvertieren mit mehreren Spalten Array (von der 2. LINQ verwendet werden)

PERSONNEL_MSTR verwenden können - Repository für alle Benutzer und ihre Daten (Vorname, Nachname, etc .).

Mein Ziel ist es, die Liste der Benutzer anzuzeigen, die die Anwendung mit ihren Details verwenden können. Also habe ich einen LINQ gemacht, um den USR_MSTR zu bekommen und vergleiche ihn mit dem 2. LINQ, der den PERSONNEL_MSTR bekommt. Mein Problem ist, ich bin mir noch nicht sicher, wie man die anderen Details außer EMP_ID unter Verwendung des Feldes weitergibt und es für den 2. LINQ benutzt.

Hinweis: Ich kann den anonymen Typ nicht verwenden, da ich Fehler damit habe.

//Get list of login users 
var users = from u in _odb.USR_MSTR 
      select new UserInformationModel 
      { 
       empid = u.EMP_ID, 
       startdate = u.BGN_DT, 
       enddate = u.END_DT, 
       usegroupid = u.USR_GRP_ID 
      }; 

string[] userList = users.Select(u => u.empid).ToArray(); 

//Get user information of login users 
var userPersonnel = from p in _odb.PERSONNEL_MSTR 
        where userList.Contains(p.EMP_ID) 
        select new UserInformationModel 
        { 
         empid = p.EMP_ID, 
         firstname = p.FNAME, 
         middlename = p.LNAME, 
         lastname = p.LNAME, 
         emailadd = p.EMAIL, 
         //Need to get the startdate, enddate and usergroupid from var users. 
         //How do I pass that to string[] userList and use it here? 
        }; 
+0

Verwenden Sie einfach einen 'Join', um die Tabellen auf' EMP_ID' ​​zu verbinden (nur eine Abfrage erforderlich) –

+0

Aber ich muss SQL 'IN' verwenden, um die in der Benutzertabelle vorhandenen personnels zu erhalten. Soweit ich weiß, haben LINQ keine direkte Entsprechung dazu. Deshalb verwende ich 2 LINQs –

+0

Oh, ich kann jetzt Ihren Punkt sehen. Also abgesehen von dem Vergleich mit dem Array von 'userList' kann ich' JOIN' verwenden, um die anderen Details zu bekommen :) Ich fühle mich dumm haha ​​ –

Antwort

3

Es sieht aus wie eine einfache Linksbindung. Eine der einfachsten Möglichkeiten, dies zu erreichen, besteht darin, eine Ansicht in Ihrer Datenbank zu erstellen. Dies ist eine gute Richtung, wenn Sie häufig und aus mehreren (Anwendungs-) Ansichten auf die verknüpften Daten zugreifen. Wenn Sie diesen Ansatz jedoch überbeanspruchen, kann dies dazu führen, dass Ihre Datenbank eine Flut von Sichten aufweist, die schwer zu pflegen sind. „Die Datenbank Lassen Sie das tun, was es ist gut“

Die Linq Aussage ist so etwas wie ...

IEnumerable<UserInformationModel> collection = from u in in _odb.USR_MSTR 
    join p in _odb.PERSONNEL_MSTR on u.EMP_ID equals p.EMP_ID 
    select new UserInformationModel() 
    { 
     empid = u.EMP_ID, 
     startdate = u.BGN_DT, 
     ... 
     firstname = p.FNAME, 
     ... 
    }; 

Es lohnt sich auf 101 Linq samples für weitere Informationen suchen. Es gibt Versionen davon auch für Lambdas, wenn Sie bevorzugen.

+1

@ Stephen-Mücke Danke, ich habe nicht bemerkt, dass OP das gleiche Modell für beide Abfragen verwendet hat. Auch Sie haben die Antwort in den Kommentar geschnitten, während ich dies schrieb. – Khyron

0

Sie könnten direkt vor der Auswahl verwenden lassen.

let systemUser = users.FirstOrDefault(x => x.empid = p.EMP_ID) 

Dies wird eine Variable mit dem Namen Systembenutzer festgelegt und Sie können die Informationen von systemUser.startdate, zum Beispiel zu bekommen. Natürlich müssen Sie vorher prüfen, ob es nicht null ist.