2017-06-07 3 views
0

Lassen Sie Benutzer eine Datenbank sein, die typische Benutzerdaten (Name, E-Mail ...) mit einer ID als Primärschlüssel enthält.Extrahieren Sie vom SQL-Server eine Liste der Benutzer mit der Liste aller gekauften Anwendungen (Zuordnungstabelle)

Lassen Sie Applications eine Datenbank sein, die eine Liste von Anwendungen (Name, Entwickler ...) mit einer ID als Primärschlüssel speichert.

Lassen Sie UsersApps die Zuordnungstabelle zwischen den beiden sein, die den Primärschlüssel verwenden. UsersApps speichert also Zeilen von ..., {102, user1_Id, appA_Id}, {103, userN_ID, appB_Id}, {104, user1_Id, appC_Id}, ... Und so weiter.

Ich möchte eine Liste von Benutzern, Daten abzurufen {name, email, List<Application> boughtApps}

Ich kämpfe eine LINQ-Anfrage zu finden, das zu tun und ich versuche, es in zwei Schritten zu tun, einen großen Tisch bekommen und dann jeder Liste des Benutzers aufbauen von Anwendungen.

  var q1 = from user in _dbContext.Users 
        join appUti in _dbContext.AppUsers on user.Id equals appUti.UsersId 
        join app in _dbContext.Applications on appUti.ApplicationId equals app.Id 
        orderby user.Id 
        select new UserDataWithApp { Id = user.Id, Name = user.Name, firstName= user.FirstName, Email = user.Email, App = app }; 

Dann q1.toList() analysieren meine gewünschten Ergebnisse Liste zu erstellen.

 var qRes = q1.ToList(); 
     int i = 0; 
     int j = 0; 
     while (i<qRes.Count()) 
     { 
       listUsersWithApps[j] = qRes[i]; 
       while (qRes[i].Id == listUsersWithApps[j].Id) // llist is ordered !! 
       { 
        listUsersWithApps[j].Apps.Add(qRes[i].Apps[0]); 
        i++; 
       } 
       j++; 
    } 

Gibt es keinen besseren Weg?

Antwort

1

können Sie Navigationseigenschaften verwenden Folgendes zu ermöglichen:

var userApps = context.Users.Select(u => new UserWithApp(u.Name, u.Email, u.Applications)) 

Fügen Sie einfach auf folgendes User:

public virtual ICollection<Application> Applications { get; set; } 

und Application:

public virtual ICollection<Users> Users { get; set; } 

So können Sie " Navigieren Sie zwischen Ihren Entitäten und schreiben Sie in folgende Abfrage (ju st passen Sie Ihre Bestellung und welche Benutzerdaten seleted werden):

var userApps = from user in context.Users 
       select new UserDataWithApp { ..., BoughtApps = user.Applications } 

hier für ein Beispiel siehe: http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

oder einem anderen interessanten Blog: https://lostechies.com/jimmybogard/2014/03/12/avoid-many-to-many-mappings-in-orms/

+0

Leider komme ich nicht, wie Sie ging von der fliessenden api zu deinem one liner :(Jedenfalls kann ich nicht einfach nochmal die DB konfigurieren, ich habe einen automatischen Generator benutzt. – Poutrathor

+0

Versuchen Sie einfach, das Beispiel im ersten Link zu verstehen. Konzentriere dich nicht auf die linq-Abfrage, es ist nicht so wichtig. Sie müssen Ihre Datenbankstruktur nicht ändern. Ich werde meinen Beitrag bearbeiten, um einige Details hinzuzufügen. –

Verwandte Themen