按多个表分组到列表

时间:2014-07-22 11:28:12

标签: c# linq

我有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以来已经有好几年了。

2 个答案:

答案 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()
           };