我有一个看起来像这样的数据:
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项。
songs.UserSongs.GroupBy(x => x.User).Select(g => new SongsForUser()
{
User = g.Key,
Songs = g.Select(s => s.SongId).ToList()
});
我怀疑你想要的:
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虽然。
比方说,你有以下几种:
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首歌曲的列表。
在最简单的形式你可以:
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();