在这个函数上,我得到一个无效的强制转换异常,并将其作为详细错误
无法转换类型为'System.Data.Entity.Infrastructure.DbQuery
1[<>f__AnonymousType8
的对象2 [System.Nullable1[System.TimeSpan],System.String]]' to type 'System.Linq.IOrderedQueryable
1 [YourReservation.Models.Reservation]'。
代码:
[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;
}
我并不确切地知道出了什么问题,因为我之前已经多次对返回变量进行过这种特殊的演绎。
答案 0 :(得分:1)
您需要使用转化Select
。
return query.Select(v => new Reservation { v.Time, v.FullName });
您无法直接将匿名类型(new {}
语法)转换为普通类型。
另请注意,这不是OrderedQueryable,您将返回IEnumerable<Reservation>
。
答案 1 :(得分:1)
在LINQ中,如果在select部分中的new关键字后没有指定类型,则结果类型是匿名的,并且您的方法具有返回类型:
IOrderedQueryable<Reservation>
匿名类型是直接从object派生的类类型,不能转换为除object之外的任何类型。(参阅:https://msdn.microsoft.com/en-GB/library/bb397696.aspx?f=255&MSPPError=-2147217396)
因此,您只需提及类型,即linq的选择部分中的预留,如下所述
var query = (from r in db.Reservations
where r.ReservationDate == DateTime.Now
select new Reservation { Time = r.ReservationTime, FullName = r.FirstName + " " + r.LastName });