无效的Cast异常DBQuery LINQ

时间:2016-03-23 01:57:35

标签: c# linq

在这个函数上,我得到一个无效的强制转换异常,并将其作为详细错误

  

无法转换类型为'System.Data.Entity.Infrastructure.DbQuery 1[<>f__AnonymousType8的对象2 [System.Nullable 1[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;
}

我并不确切地知道出了什么问题,因为我之前已经多次对返回变量进行过这种特殊的演绎。

2 个答案:

答案 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 });