我需要一些帮助编写LINQ查询,我正在尝试做一些“条件/复合”分组。 (不确定这是正确的术语)。让我解释一下。
如果我有以下课程:
class Device
{
int Id;
string DeviceType;
string DeeviceValue;
}
class Employee
{
int Id;
int SupervisorId;
int CountryId;
List<Device> Devices = new List<Device>();
}
从这里可以说我有这些对象:
List<Employee> Employees = new List<Employee>();
var emp1 = new Employee();
emp1.Id = 1;
emp1.CountryId = 1;
emp1.SupervisorId = 1;
Device dev1 = new Device();
dev1.Id = 1;
dev1.DeviceType = "Desk Phone";
dev1.DeviceValue = "132456789";
emp1.Devices.Add(dev1);
Employees.Add(emp1);
var emp2 = new Employee();
emp2.Id = 2;
emp2.CountryId = 1;
emp2.SupervisorId = 1;
Device dev2 = new Device();
dev2.Id = 2;
dev2.DeviceType = "Desk Phone";
dev2.DeviceValue = "123456789";
emp2.Devices.Add(dev2);
Device dev6 = new Device();
dev6.Id = 6;
dev6.DeviceType = "Conference Phone";
dev6.DeviceValue = "123456789";
emp2.Devices.Add(dev6);
Employees.Add(emp2);
var emp3 = new Employee();
emp3.Id = 3;
emp3.CountryId = 2;
emp3.SupervisorId = 1;
Device dev3 = new Device();
dev3.Id = 3;
dev3.DeviceType = "Desk Phone";
dev3.DeviceValue = "456789123";
emp3.Devices.Add(dev3);
Employees.Add(emp3);
var emp4 = new Employee();
emp4.Id = 4;
emp4.CountryId = 2;
emp4.SupervisorId = 4;
Device dev4 = new Device();
dev4.Id = 4;
dev4.DeviceType = "Desk Phone";
dev4.DeviceValue = "987123456";
emp4.Devices.Add(dev4);
Device dev5 = new Device();
dev5.Id = 5;
dev5.DeviceType = "Dealerboard";
dev5.DeviceValue = "987123456";
emp4.Devices.Add(dev5);
Employees.Add(emp4);
从此我想创建一个按 - >分组的查询SupervisorId - &gt; CountryId - &gt;设备类型。这很好,我有以下查询,它给了我想要的东西。
var result = Employees.SelectMany(e => e.Devices, (employee, devices) => new { employee, devices })
.GroupBy(e => new { e.devices.DeviceType, e.employee.SupervisorId, e.employee.CountryId })
.Select(e => new
{
DeviceType = e.Key.DeviceType,
Supervisor = e.Key.SupervisorId,
Country = e.Key.CountryId,
employees = e
});
我遇到的问题是我想创建一个可以包含多种设备类型的DeviceType组,“桌面电话”和“会议电话”,而不是为每种设备类型设置一个单独的组。
编辑 - 完整性
以上查询给出了以下结果
我追求的结果是:
有没有办法通过LINQ执行此操作并修改我已有的查询?
非常感谢任何帮助。
皮特
答案 0 :(得分:2)
为每个设备类型和组的值创建一个包含密钥的字典,然后在分组上使用字典
var deviceGroup = new Dictionary<string, string>() { { "Desk Phone", "Phone" }, { "Conference Phone", "Phone" } };
var result = Employees.SelectMany(e => e.Devices, (employee, devices) => new { employee, devices })
.GroupBy(e => new {
DeviceGroup = deviceGroup.ContainsKey(e.devices.DeviceType) ?
deviceGroup[e.devices.DeviceType]
: e.devices.DeviceType,
e.employee.SupervisorId, e.employee.CountryId })
.Select(e => new
{
DeviceGroup = e.Key.DeviceGroup,
Supervisor = e.Key.SupervisorId,
Country = e.Key.CountryId,
employees = e
});