C# 使用Linq展平设备和仪表数据
我使用的是一个树控件,需要在将数据交给控件之前将其展平。我尝试过各种在线示例,但不能完全正确地“展平”数据 设备有很多米 结果列表必须是DeviceHierarchyDataItem的展开列表 代码如下所示: 我猜我走错路了C# 使用Linq展平设备和仪表数据,c#,linq,C#,Linq,我使用的是一个树控件,需要在将数据交给控件之前将其展平。我尝试过各种在线示例,但不能完全正确地“展平”数据 设备有很多米 结果列表必须是DeviceHierarchyDataItem的展开列表 代码如下所示: 我猜我走错路了 public IQueryable<DeviceHierarchyDataItem> Query(int circuitConnectId) { var devices = (from device in UnitOfWork.Device
public IQueryable<DeviceHierarchyDataItem> Query(int circuitConnectId)
{
var devices = (from device in UnitOfWork.Device
join deviceCircuit in UnitOfWork.DeviceCircuit on device.Id equals deviceCircuit.DeviceId
where
deviceCircuit.CircuitConnectId == circuitConnectId
select device)
.Include( x=> x.Meters);
// Not sure what to do NEXT (previous attempts have failed)
}
课程:
是一个处理列表的极好的包
使用反应树功能将列表展平。找到了一个例子。是处理列表的一个极好的包
使用反应树功能将列表展平。已找到示例。您可以使用它展平集合集合
var devices = (from device in UnitOfWork.Device
join deviceCircuit in UnitOfWork.DeviceCircuit on device.Id equals deviceCircuit.DeviceId
where
deviceCircuit.CircuitConnectId == circuitConnectId
select device)
.Include( x=> x.Meters);
var deviceHierarchyDataItems = devices
.SelectMany(device => device.Meters.Select(meter => new DeviceHierarchyDataItem
{
Id = meter.Id,
ChildOf = device.Id,
CircuitConnectId = 0, // don't know what you need here
DisplayName = meter.MeterName
}))
.Concat(devices.Select(device => new DeviceHierarchyDataItem
{
Id = device.Id,
ChildOf = null,
CircuitConnectId = 0, // don't know what you need here
DisplayName = device.DeviceName
}));
或者:
var deviceHierarchyDataItems = devices
.SelectMany(device => device.Meters.Select(meter => new DeviceHierarchyDataItem
{
Id = meter.Id,
ChildOf = device.Id,
CircuitConnectId = 0, // don't know what you need here
DisplayName = meter.MeterName
}).Concat(new List<DeviceHierarchyDataItem>()
{
new DeviceHierarchyDataItem
{
Id = device.Id,
ChildOf = null,
CircuitConnectId = 0, // don't know what you need here
DisplayName = device.DeviceName
}
}));
可以使用展开集合集合
var devices = (from device in UnitOfWork.Device
join deviceCircuit in UnitOfWork.DeviceCircuit on device.Id equals deviceCircuit.DeviceId
where
deviceCircuit.CircuitConnectId == circuitConnectId
select device)
.Include( x=> x.Meters);
var deviceHierarchyDataItems = devices
.SelectMany(device => device.Meters.Select(meter => new DeviceHierarchyDataItem
{
Id = meter.Id,
ChildOf = device.Id,
CircuitConnectId = 0, // don't know what you need here
DisplayName = meter.MeterName
}))
.Concat(devices.Select(device => new DeviceHierarchyDataItem
{
Id = device.Id,
ChildOf = null,
CircuitConnectId = 0, // don't know what you need here
DisplayName = device.DeviceName
}));
或者:
var deviceHierarchyDataItems = devices
.SelectMany(device => device.Meters.Select(meter => new DeviceHierarchyDataItem
{
Id = meter.Id,
ChildOf = device.Id,
CircuitConnectId = 0, // don't know what you need here
DisplayName = meter.MeterName
}).Concat(new List<DeviceHierarchyDataItem>()
{
new DeviceHierarchyDataItem
{
Id = device.Id,
ChildOf = null,
CircuitConnectId = 0, // don't know what you need here
DisplayName = device.DeviceName
}
}));
请尝试以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication86
{
class Program
{
static void Main(string[] args)
{
int circuitConnectId = 123;
var devices = (from device in UnitOfWork.Device
join deviceCircuit in UnitOfWork.DeviceCircuit on device.Id equals deviceCircuit.Id
where
deviceCircuit.CircuitConnectId == circuitConnectId
select new { device = device, deviceCircuit = deviceCircuit })
.Select(x => new
{
meters = x.device.Meters.Select(y => new { deviceName = x.device.DeviceName, deviceId = x.device.Id, meterId = y.Id, meterName = y.MeterName, circuitId = x.deviceCircuit.Id, circuitDisplayName = x.deviceCircuit.DisplayName }),
}).ToList();
}
}
public class UnitOfWork
{
public static List<Device> Device { get; set; }
public static List<DeviceHierarchyDataItem> DeviceCircuit { get; set; }
}
public class DeviceHierarchyDataItem
{
public int Id { get; set; } //<-- the 'Id' of the Device or Meter
public int? ChildOf { get; set; } //<-- the 'Id' of the PARENT Device or NULL
public int CircuitConnectId { get; set; }
public string DisplayName { get; set; } //<-- the 'Name' of the Device or Meter
}
public class Device
{
public int Id { get; set; }
public string DeviceName { get; set; }
public List<Meter> Meters { get; set; }
}
public class Meter
{
public int Id { get; set; }
public string MeterName { get; set; }
}
}
请尝试以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication86
{
class Program
{
static void Main(string[] args)
{
int circuitConnectId = 123;
var devices = (from device in UnitOfWork.Device
join deviceCircuit in UnitOfWork.DeviceCircuit on device.Id equals deviceCircuit.Id
where
deviceCircuit.CircuitConnectId == circuitConnectId
select new { device = device, deviceCircuit = deviceCircuit })
.Select(x => new
{
meters = x.device.Meters.Select(y => new { deviceName = x.device.DeviceName, deviceId = x.device.Id, meterId = y.Id, meterName = y.MeterName, circuitId = x.deviceCircuit.Id, circuitDisplayName = x.deviceCircuit.DisplayName }),
}).ToList();
}
}
public class UnitOfWork
{
public static List<Device> Device { get; set; }
public static List<DeviceHierarchyDataItem> DeviceCircuit { get; set; }
}
public class DeviceHierarchyDataItem
{
public int Id { get; set; } //<-- the 'Id' of the Device or Meter
public int? ChildOf { get; set; } //<-- the 'Id' of the PARENT Device or NULL
public int CircuitConnectId { get; set; }
public string DisplayName { get; set; } //<-- the 'Name' of the Device or Meter
}
public class Device
{
public int Id { get; set; }
public string DeviceName { get; set; }
public List<Meter> Meters { get; set; }
}
public class Meter
{
public int Id { get; set; }
public string MeterName { get; set; }
}
}
这完全有道理…我只需要看一个好的…非常感谢。这完全有道理…我只需要看一个好的…非常感谢。这个答案是错误的,原因有两个:1它实现了输出,而原始函数返回IQueryable。结果不是平坦的,它是IEnumerable的集合。它是平坦的。类的所有属性都是同一可枚举项的一部分。如果在类A、子类B和孙子类C中有属性,那么我在同一个匿名对象中创建了所有属性。这个答案是错误的,原因有二:1它具体化了输出,而原始函数返回IQueryable。结果不是平坦的,它是IEnumerable的集合。它是平坦的。类的所有属性都是同一可枚举项的一部分。如果在类A、子类B和孙子类C中有属性,那么我在同一个匿名对象中创建了所有属性。