Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 4 von 4
  1. #1
    Aufsteiger
    Registriert seit
    23.11.2014
    Beiträge
    60

    Standard Liste aus zweiter Relation erstellen

    Hallo Leute,

    ich habe zwei Relationen:

    Reservierung: ReservierungsId, Anreisetag, HausId
    Haus: HausId, Bezeichnung

    Ich möchte nun zu jedem Haus die dazugehörigen Reservierungen selektieren. Das Ergebnis sollte denn ungefähr so aussehen:

    HausId | Bezeichnung | Anreisetag(e)
    1 | Alpha-Haus | 10.11.2016, 11.11.2016, 13.11.2016 [...]
    2 | Beta-Haus | 29.11.2016, 31.03.2016 [...]

    Mich interessiert einerseits der SQL-Befehl dazu, und letztendlich wollte ich das denn mit LINQ implementieren, so dass mein HausViewModel die Häuser mit den dazugehörigen Reservierungen ausgeben kann.

    Code C:
        public class HouseViewModel
        {
            [Key]
            [Display(Name = "Nummer")]
            public string HouseId { get; set; }
            [Display(Name = "Hausnummer")]
            public string House { get; set; }
     
            public List<ReservationViewModel> Reservations = new List<ReservationViewModel>();
     
            public static IQueryable<HouseViewModel> GetHouses(DatabaseContext db)
            {
                return
                    from a in db.Houses
                    join r in db.Reservations on a.HouseId equals r.HouseId
                    select new HouseViewModel
                    {
                        HouseId = a.HouseId ,
                        House = a.House
                        //Reservations = ????
                    };
            }
        }

    Könntet ihr mir auf die Sprünge helfen? Wie kann ich mittels SQL für ein Feld eine Liste aus einer "entfernten" Spalte selektieren? Und wäre die Implementierung des HouseViewModel so korrekt mit der Eigenschaft public List<ReservationViewModel>?

    Oder hat jemand ein Schlüsselwort, bei dem mein Problem einzuordnen wäre, so dass ich selber noch mal forschen könnte? Irgendwie stehe ich auf dem Schlauch..

  2. #2
    Forenheld
    Registriert seit
    26.02.2003
    Beiträge
    16.262

    Standard

    select hausId, bezeichnung,anreisetag from Reservierung,Haus where Haus.hausid=Reserveirung.hausID



    Warum die Frag nicht im Forum zur passenden DB? Was hat das mit ASP zu tun?
    Christian

  3. #3
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.829

    Standard

    Und wäre die Implementierung des HouseViewModel so korrekt mit der Eigenschaft public List<ReservationViewModel>?
    Gefühlt nein. Wenn deine Datenbank und das daraus generierte Model das du über den DatabaseContext ansprichst ~normal~ aufgebaut ist (heißt hier die Datenbank enthält eine echte Foreign Key Beziehung zwischen Houses und Reservations über HouseId) dann hat die Model Klasse hinter db.Houses bereits eine Navigational Property über die du an die dazu gehörenden Reservations kommst. Nochmal über ein explizites LINQ sich das zu holen sieht überflüssig aus. Du must halt nur die einzelnen Reservations auf ein ReservationViewModel mappen.

    Es sieht so aus als wolltest du mit Dömanenmodellen arbeiten als ein spezielles Viewmodel einem Persistenzmodel gegenüberstellen wollen. In dem Fall solltest du überlegen ein Objektmapper zu verwenden (AutoMapper, ValueInjecter, Mapster etc.). Persönlich würde ich auch die Methoden um Daten aus der Datenbankschicht zu holen um die in eine Viewmodell Klasse zu verwandeln(also z.B um aus House ein HouseViewModel zu machen). Du hast dir jetzt eine Abhängigkeit auf das Persistenzmodel (das Viewmodel kennt den DatabaseContext) gebastelt die nicht hilfreich ist. Sie zerstört die saubere Trennung zwischen Viewmodel und Persistenzmodel.


    Bezüglich der Frage mit der Darstellung in SQL. Nein klassisches SQL hat von Haus aus sowas nicht. Verschiedene Zugriffsmethoden haben da verschiedene properietäre Lösungen. Bei ADO gabs da zum Beispiel Shapes (hierarchische Recordsets) mit dem man sowas machen könnte. LINQ macht da ziemlich wilde Dinge im Hintergrund um da passendes SQL dafür zu generieren. Wenn du wissen willst wie das Sql aussieht das da generiert wird wäre ein Tool wie Linqpad zu empfehlen.

  4. #4
    Aufsteiger
    Registriert seit
    23.11.2014
    Beiträge
    60

    Standard

    Vielen Dank für eure Hilfestellungen!

    dann hat die Model Klasse hinter db.Houses bereits eine Navigational Property
    Ja, hat sie scheinbar auch: public virtual IList<Reservation> Reservations { get; set; }

    Du must halt nur die einzelnen Reservations auf ein ReservationViewModel mappen.
    Den Schritt verstehe ich nicht so ganz. Ich habe ja bereits ein ReservationViewModel. Wenn ich nun aber darüber die Häuser abrufe, denn erscheinen halt nur die Häuser, die auch eine Reservierung besitzen.
    Code C:
        public class ReservationViewModel
        {	
            [Display(Name = "Hausnummer")]
            public string House { get; set; }
     
            [Display(Name = "Von")]
            [DataType(DataType.Date)]
            [Required]
            public System.DateTime Arrival { get; set; }
     
     
            public static IQueryable<ReservationViewModel> GetReservationsByUser(DatabaseContext db, int ownerId)
            {
                month = DateTimeExtension.GetMonthWithoutLeadingZero(month); // 01 => 1
     
                return
                    from r in db.Reservations
                    join h in db.House on r.HouseId equals h.HouseId
                    join o in db.Owners on h.OwnerId equals o.OwnerId
                    where o.OwnerId == ownerId
     
                    select new ReservationViewModel
                    {
                        House = r.HouseId,
                        Arrival = r.Arrival
                    };
            }

    das Viewmodel kennt den DatabaseContext
    Danke. Ich habe jetzt innerhalb des Viewmodels eine Instanz angelegt und den Parameter entfernt.

    Ich habe die Eigenschaft Reservation der Klasse HouseViewModel nun angepasst. Ich kann so nun auf alle Häuser und alle Reservierungen zugreifen und das in der View denn verarbeiten. Irgendwie habe ich aber immer noch das ungute Gefühl, dass es so nicht sinnvoll ist:

    Code C:
        public class HouseViewModel
        {
            [Key]
            [Display(Name = "Nummer")]
            public string HouseId { get; set; }
            [Display(Name = "Hausnummer")]
            public string House { get; set; }
     
            public IList<Reservation> Reservations;
     
            private DatabaseContext db = new DatabaseContext();
     
            public static IQueryable<HouseViewModel> GetHouses()
            {
     
                return
                    from h in db.Houses
                    select new HouseViewModel
                    {
                        HouseId = h.HouseId,
                        House= h.House,
                        Reservations = h.Reservations
                    };
            }
        }
    Geändert von kogen (09.12.2016 um 09:28 Uhr)

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •