Fragensteller
ASP.NET MVC4: n:m Tabellen per Linq abfragen

Allgemeine Diskussion
-
Hallo Wissende,
eine Intranet-Webseite (MVC4) verwaltet Benutzer und Verfahren, die zueinander in einer n:m-Beziehung stehen und über die Tabelle RelBenutzerVerfahren (Benutzer 1:n RelBenutzerVerfahren n:1 Verfahren) aufgelöst werden.
Hintergrund ist, dass die Seite in einer großen Domain läuft, aber nur wenige Benutzer bestimmte Verfahren nutzen können sollen. Das wichtige ist, dass die Benutzer nicht über das AD, sondern über eine eigene Logik verwaltet werden.
Windows-Authentifizierung ist aktiv.
In diesem Beispiel möchte ich für den authentifizierten Nutzer alle Anwendungen anzeigen.
Hatte gehofft, etwas in dieser Art mit Linq im Controller abzufragen:
var anwendungen = db.Verfahren.Where(v => v.RelBenutzerVerfahren.BenutzerId == (db.Benutzer.Where(b => b.Kennung == User.Identity.Name).Select(b => b.Id));
Natürlich hat das so nicht geklappt ;-)
Also habe ich versucht, mich schrittweise zu nähern, indem ich erst Mal die Id des Benutzers hole:
// Sind diesem Benutzer Verfahren zugeordnet var benutzerId = db.Benutzer.Where(b => b.Kennung == User.Identity.Name).Select(b => b.Id);
Dies hätte den Vorteil, dass ich, wenn benutzerId null ist, darauf im Programm reagieren könnte - ist aber nicht Gegenstand dieser Frage.
Aber auch mit dem nächsten Schritt komme ich nicht klar:
var anwendungen = db.Verfahren.Where(v => v.RelBenutzerVerfahren.BenutzerId == benutzerId)
denn hier kann ich nicht auf RelBenutzerVerfahren.BenutzerId zugreifen.
Kurzum, wie muss ich es richtig machen, dass ich
- zu einem Benutzer alle Verfahren bzw
- zu einem Verfahren alle Benutzer abgefragt bekomme?
Vielen Dank!
KonFiDa
- Typ geändert Ciprian Bogdan Mittwoch, 22. Januar 2014 09:50 keine Rückmeldung des Fragestellenden
Alle Antworten
-
Hallo,
in der Zeilevar anwendungen = db.Verfahren.Where(v => v.RelBenutzerVerfahren.BenutzerId == benutzerId)
wird in der Where-Methode jedes Element geprüft. v hat also den Typ der Elemente der Auflistung. Entsprechend muss auch der Typ die Eigenschaft RelBenutzerVerfahren.BenutzerId aufweißen.
Nachfolgend mal ein kleines Beispiel zu deinen 2 Fragen (ohne DB):
class Program { static void Main(string[] args) { //Verschiedene Benutzer mit Verschiedenen Verfahren List<Benutzer> b = new List<Benutzer>(new Benutzer[] { new Benutzer() { Id = 0, Name = "Tom", } , new Benutzer() { Id =1, Name = "Max", } , new Benutzer() { Id = 2, Name = "John", } , }); //Die Verfahren List<Verfahren> v = new List<Verfahren>(new Verfahren[]{ new Verfahren (){ Id =0 , Name ="ABC",}, new Verfahren (){ Id =1 , Name ="XYZ",}, new Verfahren (){ Id =2 , Name ="123",}, }); List<RelBenutzerVerfahren> r = new List<RelBenutzerVerfahren>(new RelBenutzerVerfahren[]{//Die Verknüpfungen zwischen Verfahren und Benutzern new RelBenutzerVerfahren (){ BenutzerId =0, VerfahrensId =0}, new RelBenutzerVerfahren (){ BenutzerId =0, VerfahrensId =1}, new RelBenutzerVerfahren (){ BenutzerId =0, VerfahrensId =2}, new RelBenutzerVerfahren (){ BenutzerId =1, VerfahrensId =1}, new RelBenutzerVerfahren (){ BenutzerId =2, VerfahrensId =1}, }); //Nachfolgende Abfragen dürften für dich interessant sein var benutzerId = 0; var benutzer = b.FirstOrDefault(x => x.Id == benutzerId);//Benutzer mit einer Id abfragen int verfahrensId = 0; var verfahren = v.FirstOrDefault(x => x.Id == verfahrensId);//Verfahren mit einer Id abfragen var sel_verfahrenIds = r.Where(x => x.BenutzerId == benutzerId).Select(x => x.VerfahrensId);//Id's der Verfahren auswählen var sel_verfahren = v.Where(x => sel_verfahrenIds.Contains(x.Id));//Verfahren auswählen var sel_benutzerIds = r.Where(x => x.VerfahrensId == verfahrensId).Select(x => x.BenutzerId);//Id's der Benutzer auswählen var sel_benutzer = v.Where(x => sel_benutzerIds.Contains(x.Id));//Benutzer auswählen } } class Benutzer { public int Id { get; set; } public string Name { get; set; } } class RelBenutzerVerfahren { public int BenutzerId { get; set; } public int VerfahrensId { get; set; } } class Verfahren { public int Id { get; set; } public string Name { get; set; } }
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hi KonFiDa,
ist dieser Thread noch aktuell ? Bist Du hier inzwischen weitergekommen ?
Gruß,
Ciprian
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
*****************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
*****************************************************************************************************
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.