使用平均值时linq查询出错

时间:2013-09-25 16:06:32

标签: c# sql asp.net-mvc linq lambda

我的数据库中有两个表picturepictureratings

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返回查询总数。我正在展示pictureiduserpicTitlepicFilenamepictimenuditylevelfakeslevel属性。

目前,每件事情都顺利进行,但当我添加总计= pl.Average(c => c.likenumber)时,我得到一个例外

  

转换为值类型'Double'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。

如何删除错误?

3 个答案:

答案 0 :(得分:4)

也许问题是pl没有记录,请尝试

替换

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

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

答案 1 :(得分: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)

:编辑 我认为.average在这种情况下返回一个可以为空的小数。要将其分配到您的字段,只需输入

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

Totalrating似乎是一个int,通过将它转换为int来丢弃一些信息,或者你将类型更改为double ...

答案 2 :(得分:1)

错误似乎是您的数据库有一个可以包含null值的列,但您的对象具有不可为空的double类型。

如果选择匿名类型而不是具体的类型,查询是否会运行?

即。改变这个

select new LikesandPictureDetails

select new 

如果是这样,那么您应该将目标对象中值的类型更改为可为空。