2016-03-23 7 views
0

Auf dieser Funktion erhalte ich eine ungültige Cast Exception mit diesem als der detaillierten FehlerUngültige Cast Exception DBQuery LINQ

Kann nicht das Objekt des Typs ‚System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType8 2 [System werfen. Nullable 1[System.TimeSpan],System.String]]' to type 'System.Linq.IOrderedQueryable 1 [YourReservation.Models.Reservation] '.

Code:

[HttpGet] 
[Route("api/Reservations/getPartyNames")] 
public IOrderedQueryable<Reservation>getPartyNames() 
{ 
    var query = (from r in db.Reservations 
       where r.ReservationDate == DateTime.Now 
       select new { Time = r.ReservationTime, FullName = r.FirstName + " " + r.LastName }); 

    return (IOrderedQueryable<Reservation>)query; 
} 

ich nicht genau sehen, was falsch ist, weil ich auf eine Rückkehr dieser besonderen Besetzung gemacht haben, bevor Variable mehrmals.

Antwort

1

Sie müssen eine Konvertierung Select verwenden.

return query.Select(v => new Reservation { v.Time, v.FullName }); 

Sie können keine anonymen Typ (new {} Syntax) auf eine normale Art direkt so konvertieren.

Beachten Sie auch, dass dies kein OrderedQueryable wäre, würden Sie eine IEnumerable<Reservation> zurückgeben.

+0

Beachten Sie, dass es auch möglich ist (vorausgesetzt, die Eigenschaften sind öffentlich), einfach 'Reservation' nach dem' neuen' hinzuzufügen (IE: 'wählen Sie neue Reserve {Time = r.Res ...}') und behalten Sie den Rest gleich – Rob

+0

@Rob Sollen die Variablen in der Select-Klausel mit einem Feld in meiner Reservierungsklasse identisch sein? Ich bekomme den Fehler Reservierung enthält nicht zwei Konstruktoren. – GabeCoach

+0

@GabeCoach Ja - sie müssten übereinstimmen. Angenommen, Sie haben eine Eigenschaft 'Time' und' Fullname', sollte es funktionieren. Ich bin jedoch nicht sicher über diesen Fehler, da Sie den Standardkonstruktor verwenden würden. Können wir die Reservierungsklasse sehen? – Rob

1

In LINQ, wenn kein Typ nach neuem Schlüsselwort in ausgewähltem Teil angegeben wird, dann ist das Ergebnis Typ ist anonym und Ihre Methode hat Art Rückkehr:

IOrderedQueryable<Reservation> 

Anonyme Typen sind Klassentypen, die direkt vom Objekt ableiten, und . das kann nicht auf jede Art außer Objekt gegossen werden (siehe: https://msdn.microsoft.com/en-GB/library/bb397696.aspx?f=255&MSPPError=-2147217396)

so müssen Sie nur noch die Art dh Reservierung in ausgewählten Teil von Linq erwähnen, wie unten erwähnt

var query = (from r in db.Reservations 
      where r.ReservationDate == DateTime.Now 
      select new Reservation { Time = r.ReservationTime, FullName = r.FirstName + " " + r.LastName }); 
Verwandte Themen