2013-09-25 32 views
0

我有兩個表,picturepictureratings在我的分貝。使用Linq加入,分組和計數....面臨麻煩

public partial class picture 
{ 
    public int idpicture { get; set; } 
    public int iduser { get; set; } 
    public string picTitle { get; set; } 
    public string picFilename { get; set; } 
    public System.DateTime pictime { get; set; } 
    public int nuditylevel { get; set; } 
    public int fakeslevel { get; set; } 

    // This property will hold the total accumulated/summed 
    // up rating of a picture 
    public int totalrating { get; set; }  
} 

public partial class pictureratings 
{ 
    public int idrating { get; set; } 
    public int idpictures { get; set; } 
    public int iduser { get; set; } 
    public System.DateTime iddatetime { get; set; } 
    public int iduserrateddby { get; set; } 
    public int rating { get; set; } 
} 

對於每個評級,將創建一個新的pictureratings行。我想通過圖片ID將pictureratings表分組,然後計算喜歡的。我想在picture表中顯示那些喜歡totalrating屬性的表。

所以按照我的研究到現在,我可以寫這樣的代碼

var total = from p in db.picturedetails 
      join l in db.picturelikes on p.idpictures equals l.idpictures 
      group l by l.idpictures into g 
      select new 
      { 
       IdUserPic = g.First().iduser, 
       IdPictures = g.First().idpictures, 
       totalrating = g.Count()  
      } 

我使用的Web API返回的查詢總數。因此,我的問題來了:如何顯示picture屬性,如iduser,picTitle,picFilename,pictime,nuditylevelfakeslevel?我做對了嗎?我應該怎麼做?

+0

你不告訴我們_how_你「展示」,所以屬性怎麼能說呢? –

+0

感謝您提出問題,我使用的是顯示json中所有querry數據的web api。 – Obvious

+0

檢查這個職位http://stackoverflow.com/questions/9173410/linq-combining-join-and-group-by –

回答

1

您可以對一個匿名類進行分組。這樣你就可以訪問兩個p屬性。
是這樣的:

var total = from p in db.picturedetails 
      join l in db.picturelikes on p.idpictures equals l.idpictures 
      group new {p,l} by l.idpictures into g 
      select new 
      { 
       IdUserPic = g.First().p.iduser, 
       IdPictures = g.First().p.nuditylevel, 
       totalrating = g.Count()  
      } 
+0

在使用你的技術ExceptionMessage之後,我得到這個錯誤:「The method'First'只能用作最終的查詢操作。請考慮在此實例中使用方法「FirstOrDefault」。「, – Obvious

+0

不知道爲什麼第一個被認爲是最後的分組爲匿名,但你是否嘗試使用FirstOrDefault呢?這就是說,如果你只對我加入的記錄數量感興趣,我會爲Tim的組加入解決方案,少一點靈活,但它看起來更清潔imho :) – Kristof

+0

FirstOrDefault只會給一個圖片的細節。 – Obvious

1

我覺得group join是你在找什麼:

var total = from p in db.picturedetails 
      join l in db.picturelikes on p.idpicture equals l.idpictures into pl 
      select new 
      { 
       Picture = p, 
       AverageRating = pl.Any() 
            ? pl.Average(l => l.rating) 
            : (double?)null, 
       RatingsCount = pl.Count(), 
       TotalRating = pl.Sum(l => (float?)l.likenumber) ?? 0 
      }; 

如果圖片有沒有喜歡的,這會給一個0總數和平均null該圖片。

+0

它的工作原理,你能告訴我如何平均所有的棘手?像它只是給我數,我需要這些評級的總平均數?對於一般我需要總和..如何找到所有圖片ID相同的總和? – Obvious

+0

@Hmmmmmmmmmm添加代碼以使用LINQ的['Average'](http://msdn.microsoft.com/zh-cn/library/system.linq.enumerable.average.aspx)計算平均值。 –

+0

我在使用average或sum時出現這個錯誤「由於物化值爲null,所以轉換爲值類型'Single'失敗。結果類型的泛型參數或查詢必須使用可空類型。」,這是我的代碼合計=(pl.Sum(l => l.likenumber)) – Obvious