使用合并算子?使用Average()在LINQ查询中处理null

时间:2014-04-19 20:35:32

标签: c# asp.net sql linq average

我正在使用Linq查询来填充gridview,gv的最后一列包含合作伙伴的平均评分,这是我的问题。 当一个人从未被评级时,我期待一个空值,并且我尝试使用合并运算符将其切换为0。但是我得到了一个“System.InvalidCastException:指定的强制转换无效”。我无法弄明白为什么。

我之前从未在linq中使用过这样的子查询,所以如果我在错误的路径上,请纠正我。

我在我的数据库中使用实体框架

MembershipUser u = Membership.GetUser(User.Identity.Name);

using (DatabaseEntities db = new DatabaseEntities())
{

    var q = from job in db.Jobs
            join employer in db.UserProfiles on job.UserId equals employer.UserId
            where job.ServiceProviderUid == (Guid)u.ProviderUserKey &&
            job.Finished
            select new
            {
                JobId = job.JobId,
                Title = job.Title,
                Partner = employer.FullName,
                Rating = (from ur in db.User_Ratings
                          where ur.UserId == employer.UserId
                          select (int?)ur.Rating).Average() ?? 0
            };

    GridView1.DataSource = q.ToList();
    GridView1.Columns[2].HeaderText = "Employer";
    GridView1.DataBind();
}

2 个答案:

答案 0 :(得分:3)

你想要这样吗

(int?)(from ur in db.User_Ratings
                          where ur.UserId == employer.UserId
                          select (int)ur.Rating).Average() ?? 0

如果不检查空对象,则不能使用空合并。平均值返回一个int,它不能做?反对。你试过把(int?)放在select中,如果你愿意的话,那就可以了,然后它会得到平均值,它可能会再次返回一个int而不是一个可空的。

答案 1 :(得分:0)

试试这个:

  select new
        {
            JobId = job.JobId,
            Title = job.Title,
            Partner = employer.FullName,
            Rating = (from ur in db.User_Ratings
                      where ur.UserId == employer.UserId
                      select (int)ur.Rating).Average() ?? 0 // Remove the ? after int
        };

关于你的错误。