我有4张桌子
- User
- UserId
- UserName
- Device
- DeviceId
- DeviceTypeId (FK DeviceType)
- DeviceType
- DeviceTypeId
- UserDevice
- UserId (FK User)
- DeviceId (FK Device)
我想获得1个用户拥有的设备列表,按DeviceType分组。所以结果类应该是这样的
class m
{
int DeviceTypeId;
List<Device> devices;
}
我在LINQ中尝试了一些技巧,但没有得到理想的结果。自从我上次使用LINQ以来已经有好几年了。
答案 0 :(得分:1)
我猜你想要这样的东西:
return
userDevices
.Where(ud => ud.UserId == myUserId)
.SelectMany(ud => devices.Where(d => d.DeviceId == ud.DeviceId))
.GroupBy(d => d.DeviceTypeId)
.Select(g => new m { DeviceTypeId = g.Key, devices = g.ToList() });
当然我无法测试这个,但它应该是正确的(减去一些拼写问题)
BTW:我甚至没有尝试给你一些类似ORM的语法,因为我不知道你在这里使用的是什么 - 这可能是一个相当糟糕的表现解决方案,但你应该明白......答案 1 :(得分:1)
你的评论几乎就在那里:
var data = from d in db.Devices
join dt in db.DeviceType on d.DeviceTypeId equals dt.DeviceTypeId
join du in db.UserDevices on d.DeviceId equals du.DeviceId
where (du.UserId == currentUser)
group d by d into g
select new m
{
DeviceTypeId = g.Key.DeviceTypeId,
devices = (from d in g select d).ToList()
};
如果您将public string TypeName { get; set; }
添加到m
课程,则可以使用此查询填充它:
var data = from d in devices
join dt in deviceTypes on d.DeviceTypeId equals dt.DeviceTypeId
join du in userDevices on d.DeviceId equals du.DeviceId
where (du.UserId == 1)
group d by dt into g
select new m
{
DeviceTypeId = g.Key.DeviceTypeId,
TypeName = g.Key.TypeName,
devices = (from d in g select d).ToList()
};