代码之家  ›  专栏  ›  技术社区  ›  Jordan Lewallen

使用linq在select之后将具有相同id的行添加到一起

  •  0
  • Jordan Lewallen  · 技术社区  · 6 年前

    嗨,我正在使用LINQ查询这样的表:

    AlbumID | Spotify | iTunes
    --------------------------
       5    |   12    |   4
       5    |   18    |   6
       6    |   10    |   8
    

    我想将具有相同唯一性的行加在一起 AlbumID ,我知道 GroupBy 但那会把所有相似的身份证组合在一起所以我用 Where 使用 albumID (本例中的输入参数可以是 5 )

    var platformArray = Context.Analytics.Where(x => x.AlbumID == albumId).Select(s => new
    {
        Id = s.AlbumID,
        Spotify = s.SpotifyClicks,
        Itunes = s.ItunesClicks
    });
    

    但是当我打印到调试控制台时,它不会将

    foreach (var item in platformArray)
    {
        Debug.WriteLine(item.Id);
        Debug.WriteLine(item.Spotify);
        Debug.WriteLine(item.Itunes);
    }
    

    我明白了(为了清楚起见,添加了箭头):

    5 <-ID
    12 <-Spotify
    4 <-ITunes
    5 <-ID
    18 <-Spotify
    6 <-ITunes
    

    如何重新格式化LINQ代码以打印出以下内容:

    5 <-ID
    30 <-Spotify
    10 <-Itunes
    

    谢谢!

    编辑:添加我的分析类

    public class Analytic
    {
    
        private object p1;
        private object p2;
        private object p3;
    
        public Analytic(object p1, object p2, object p3)
        {
            this.p1 = p1;
            this.p2 = p2;
            this.p3 = p3;
        }
    
        [Key]
        public int Id { get; set; }
        public int AlbumID { get; set; }
        public int SpotifyClicks { get; set; }
        public int ItunesClicks { get; set; }
    
        public virtual Album Album { get; set; }
    }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Lucifer    6 年前

    请尝试以下代码:

    var List =  from element in prod
                group element by new { element.Id } into g                
                select new yourClass
                (
                    Id = g.First().ID,
                    Spotify = g.Sum(s => s.Spotify)
                    Itunes = g.Sum(s => s.Itunes)
                );
    
        2
  •  0
  •   Jordan Lewallen    6 年前

    因此,我设法从哈桑对我的原始帖子的评论和一些额外的修正中找到了答案:

    var query = Context.Analytics
    .Where(x => x.AlbumID == albumId)
    .GroupBy(c => c.AlbumID)
    .Select(
        g =>
            new
            {
                Id = g.Key,
                Spotify = g.Sum(s => s.SpotifyClicks),
                ITunes = g.Sum(s => s.ItunesClicks),
            }
    );
    

    这只查询我的特定 albumID 并将具有该特定ID的所有行相加!

    谢谢大家

        3
  •  0
  •   Harald Coppoolse    6 年前

    所以当你把你的相册分成一组后 AlbumId ,您希望将组中的所有相册转换为一个对象,其中包含 白蛋白 ,总共 Spotify 在组中的所有相册中,以及 iTunes 在您组中的所有相册中。

    var result = albums.GroupBy(album => album.AlbumId)
        // from every group, make one element with the sum of Spotify and sum of itunes:
        .Select(group => new
        {
            AlbumId = group.Key,
            Spotify = group.Select(groupElement => groupElement.Spotify).Sum(),
            ITunes = group.Select(groupElement => groupElement.Itunes).Sum(),
        });
    

    简单的欢迎!