Announcement

Collapse
No announcement yet.

Liste aus zweiter Relation erstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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.

    [highlight=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 = ????
    };
    }
    }
    [/highlight]

    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
    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

    Comment


    • #3
      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.

      Comment


      • #4
        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.
        [highlight=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
        };
        }
        [/highlight]

        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:

        [highlight=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
        };
        }
        }
        [/highlight]
        Zuletzt editiert von kogen; 09.12.2016, 09:28.

        Comment

        Working...
        X