【问题标题】:Using Linq to Join,Group By and Count.... facing a trouble使用 Linq 加入、分组和计数....面临一个麻烦
【发布时间】:2013-09-25 14:04:33
【问题描述】:

我的数据库中有两个表,picture 和 pictureratings。

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 表进行分组,然后计算点赞数。我想在totalrating 属性的picture 表中显示这些喜欢。

所以根据我目前的研究,我可以编写这段代码

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、nuditylevel 和fakeslevel?我做对了吗?我该怎么做?

【问题讨论】:

  • 你没有告诉我们如何你是在“展示”这些属性,所以我们怎么说呢?
  • 感谢您的提问,我正在使用以 json 格式显示所有查询总数据的 web api。

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


【解决方案1】:

您可以对匿名类进行分组。这样您就可以同时访问 p & l 属性。
看起来像这样:

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()    
            }

【讨论】:

  • 我在使用您的技术后收到此错误,ExceptionMessage:“方法 'First' 只能用作最终查询操作。请考虑在此实例中使用方法 'FirstOrDefault'。”,
  • 不确定为什么在匿名分组时第一个被认为是最终结果,但您是否尝试过使用 FirstOrDefault 代替?话虽如此,如果您只对加入记录的数量感兴趣,我会选择 Tim 的组加入解决方案,灵活性稍差一些,但恕我直言:)
  • FirstOrDefault 只会给出一张图片的详细信息。
【解决方案2】:

我认为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 平均值。

【讨论】:

  • 它有效,你能告诉我如何平均所有的老鼠吗?就像它只是给我计数一样,我需要这些评级的总平均值吗?平均而言,我需要总和..如何找到具有相同图片 ID 的所有图片的总和?
  • @Hmmmmmmmmmm 添加了使用 LINQ 的 Average 计算平均值的代码。
  • 我在使用平均值或求和时遇到此错误“转换为值类型 'Single' 失败,因为具体化值为空。结果类型的通用参数或查询必须使用可为空的类型。 ", 这是我的代码 totalrating = (pl.Sum(l =>l.likenumber))
  • 可能是由于翻译后的 SQL 如何处理空列表而导致的错误。试试TotalRating = pl.Select(l => l.rating).DefaultIfEmpty(0).Sum()
  • 或totalrating = (pl.Sum(l => (float?)l.likenumber))
猜你喜欢
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多