2017-02-10 44 views
1

我是C#的初学者。我熟悉SQLStatement,但在LINQ中不太好。现在我需要做的是使用LINQ语句查询booking.PackageIdAvG(booking.Rating)分组booking.Package。 (我需要根据不同的PackageID显示平均评分)。我怎么能通过使用ASP.NET中的LINQ查询平均和组#

Here is my booking table

我想用一个列表视图显示所有信息

<asp:ListView 
    ID="lvBookings" runat="server" 
    DataKeyNames="BookingId" 
    ItemType="TravelPlannerSystem.Models.Booking" 
    SelectMethod="GetFeedbacks"> 

这是我的代码背后GetFeedbacks

public IQueryable<Booking> GetFeedbacks() 
{ 
    var db = new TravelPlannerContext(); 
    var query = from booking in db.Bookings 
       group booking by booking.PackageId into grouping 
       select new { 
       PackId = grouping.Key, 
       AverageRating = grouping.Average(ed => ed.Rating) 
       }; 
    return query; 
} 

它保存给我的错误,我一直在线搜索2天。我真的不知道如何改变这一点。任何人都可以帮忙吗?

+0

请加上你得到的错误,所以很明显 –

回答

2

的原因是你的函数需要的IQueryable<Booking>返回值,但你正在返回IQueryable<AnonymousType>:您的投影(该select部分)创建new {}这是一个匿名类型与PackIdAverageRating

这种新类型不是Booking类型,也是它失败的原因。

你应该做的,因为你不能返回一个匿名类型(我想用动力学这里不会是一个很好的做法)是创建一个新的类,然后:

public IQueryable<YourClass> GetFeedbacks() 
{  
    return from booking in (new TravelPlannerContext()).Bookings 
      group booking by booking.PackageId into grouping 
      select new YourClass // Now you are projecting the expected type 
      { 
       PackId = grouping.Key, 
       AverageRating = grouping.Average(ed => ed.Rating) ?? 0 
      }; 
} 

见reRurn值和投影如何都是同一类型

+0

谢谢,吉拉德。但是当我在我的文件中替换你的代码后,我得到了一个新的错误(ed => ed.Rating),说:“不能隐式转换类型'双?到'double'。一个明确的转换存在(你是否缺少一个演员?)“。 –

+1

错误解释了它的好处......您的“AverageRating”字段的类型是什么?以及您的“评分”字段的类型是什么?在任何情况下,请参阅更新:) –

+0

这是我创建实体框架生成的评级字段:public Nullable Rating {get;组; }。以下是我自己设立的平均评分栏:public double AverageRating {get;组; } –

-1

尝试在传递给视图之前将此查询转换为.to。使用Tolist()进行转换。

+1

请添加一些示例代码来帮助OP。 –