如何使用LINQ选择到对象?

问题描述 投票:26回答:4

我有一个看起来像这样的数据:

UserId   |  SongId
--------   --------
1          1
1          4
1          12
2          95

我也有以下类:

class SongsForUser
{
    public int User;
    public List<int> Songs;
}

我想这样做的是使用LINQ从我的数据选择创建SongsForUser对象的集合。下面是我想出迄今:

var userCombos = songs.UserSongs.Select(x => new SongsForUser() { User = x.UserId, 
                                                                  Songs = /*What goes here?*/ });

我怎么会去填充我的Songs列表?

所以结果应该是两个SongsForUser对象。对于用户1它会在Songs列表3项。对于用户2它会在Songs列表1项。

c# .net linq linq-to-entities
4个回答
37
投票
songs.UserSongs.GroupBy(x => x.User).Select(g => new SongsForUser() 
{ 
    User = g.Key,
    Songs = g.Select(s => s.SongId).ToList()
});

19
投票

我怀疑你想要的:

var songsByUser = songs.UserSongs
                       .GroupBy(song => song.UserId, song => song.SongId)
                       .Select(g => new SongsForUser { User = g.Key,
                                                       Songs = g.ToList() });

为了解释,在GroupBy后都会有一帮组,其中每组的关键是用户ID,而组内的值是歌曲的ID:

Key = 1, Values = 1, 4, 12
Key = 2, Value = 95

然后,你只是转换是到您的SongsForUser类型。需要注意的是在调用对象初始构造函数时,你不需要明确包括() - 这是隐含的,除非你需要指定构造函数的参数。

你可以做到这一切在一个GroupBy电话,顺便说一下:

var songsByUser = songs.UserSongs
         .GroupBy(song => song.UserId, song => song.SongId,
                  (user, ids) => new SongsForUser { User = user,
                                                    Songs = ids.ToList() });

我个人通常会发现一个单独的Select呼吁更具可读性。

你也可以做这一切与一个查询表达式:

var songsByUser = from song in songs.UserSongs
                  group song.SongId by song.UserId into g
                  select new SongsForUser { User = g.Key, Songs = g.ToList() };

编辑:上面是“供应商中立”,但它听起来像它不使用LINQ合作实体。您可能能够得到像这样的工作:

var songsByUser = songs.UserSongs
                       .GroupBy(song => song.UserId, song => song.SongId)
                       .AsEnumerable()
                       .Select(g => new SongsForUser { User = g.Key,
                                                       Songs = g.ToList() });

AsEnumerable通话将迫使分组到数据库中完成,但最终投射(包括ToList调用)在本地完成。您应该检查效率生成的SQL虽然。


1
投票

比方说,你有以下几种:

public class SongsForUser
{
    public int UserId;
    public List<int> Songs;
}

然后,像这样的一个功能,在这里就可以了。该名单只是那里有一些数据来测试。

    public void Group()
    {
        List<Tuple<int, int>> SongRelations = new List<Tuple<int, int>>();

        SongRelations.Add(new Tuple<int, int>(1, 1));
        SongRelations.Add(new Tuple<int, int>(1, 4));
        SongRelations.Add(new Tuple<int, int>(1, 12));
        SongRelations.Add(new Tuple<int, int>(2, 95));

        var list = SongRelations.GroupBy(s => s.Item1)
                                .Select(r => new SongsForUser()
                                {
                                    UserId = r.Key,
                                    Songs = r.Select(t => t.Item2).ToList(),
                                });
    }

list包含2项类型SongsForUser算账。一个与用户1和含1,4和12和一个与用户2首歌曲的列表和包含95首歌曲的列表。


0
投票

在最简单的形式你可以:

List<MapPoint> points = db.PropertyResearches.Where(a => a.deptId == 66).Select(x => new MapPoint { property = x.notes.Substring(0, 10), latitude = x.lat, longitude = x.@long }).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.