2017-02-10 17 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。 –