2013-09-25 42 views
1

我在我的數據庫中有兩個表,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 combo = from p in db.picturedetails 
        join l in db.picturelikes on p.idpictures equals l.idpictures into pl 
        select new LikesandPictureDetails 
        { 
          IdUserPic = p.iduser, 
          IdPicturess =p.idpictures, 
          Likes = p.likes, 
          NudityLevel = p.nuditylevel, 
          PicTitle = p.picTitle, 
          PicTime = p.pictime, 
          picFilename=p.picFilename, 
          Count=pl.Count(), 
          totalrating = pl.Average(c => c.likenumber) // This line is causing error 
        }; 

我使用的Web API返回的查詢總數。我正在顯示picture屬性,如iduser,picTitle,picFilename,pictime,nuditylevelfakeslevel

按現在每一件事情運行平穩,但是當我添加totalrating = pl.Average(C => c.likenumber),我得到一個異常說

演員陣容價值型「雙」失敗因爲物化值爲空。結果類型的泛型參數或查詢都必須使用可爲空的類型。

如何清除錯誤?

+0

可能重複... 。面臨麻煩](http://stackoverflow.com/questions/19007164/using-linq-to-join-group-by-and-count-facing-a-trouble) –

回答

1

錯誤似乎是你的數據庫有一列可以包含null值,但你的對象有一個不可空的double類型。

如果選擇了匿名類型而不是具體的查詢,查詢是否會運行?

即。改變這種

select new LikesandPictureDetails 

select new 

如果是這樣,那麼你應該改變一個值的類型,你的目標對象爲空。

+0

如何解決這個問題? – Obvious

+0

不,它不運行 – Obvious

2

db.picturelikes.likenumber似乎是空的?雖然找不到代碼中定義的屬性。 不管怎麼說,你可以選擇不爲空通過把

pl.Where(a=>a.likenumber != DBNull.Value /* or null whatever this is... */).Average... 

所有條目。如果它是一個可空的屬性:

pl.Where(a=>a.likenumber.HasValue).Average(a=>a.likenumber.Value) 

:編輯 我覺得。平均在這種情況下返回null的小數。將其分配給你的領域,簡單地說

totalrating = pl.Average(c => c.likenumber) 

Totalrating似乎是一個int,eigther你會鑄造它歸結爲一個int寬鬆一些信息,或者您更改類型翻番......

+0

兩者都不起作用。 Hasvalue選項在intellisense中沒有顯示出來。 – Obvious

+0

比較哪種類型? – MichaC

+0

Dbnull給出Errr:\t運算符'!='不能應用於類型'int'和'System.DBNull'的操作數 – Obvious

3

也許問題是,PL沒有記錄,嘗試

更換

totalrating = pl.Average(c => c.likenumber) // This line is causing error 

與[使用LINQ to加入,GROUP BY和計數的

totalrating = pl.DefaulIfEmpty(0).Average(c => c.likenumber)