1

我有两个表,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将创建一个新行。我想pictureratings按图片ID对表格进行分组,然后计算喜欢。我想在属性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属性。iduserpicTitlepicFilenamepictimenuditylevelfakeslevel

按照现在每件事都运行顺利,但是当我添加 totalrating = pl.Average(c => c.likenumber) 时,我得到一个例外说

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

如何消除错误?

4

3 回答 3

4

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

代替

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

totalrating = pl.DefaulIfEmpty(0).Average(c => c.likenumber) 
于 2013-09-26T00:57:03.817 回答
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)

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

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

Totalrating 似乎是一个 int,要么通过将其转换为 int 来丢失一些信息,要么将类型更改为 double ...

于 2013-09-25T16:12:09.153 回答
1

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

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

IE。改变这个

select new LikesandPictureDetails

select new 

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

于 2013-09-25T16:09:01.817 回答