C# 使用Linq展平设备和仪表数据

C# 使用Linq展平设备和仪表数据,c#,linq,C#,Linq,我使用的是一个树控件,需要在将数据交给控件之前将其展平。我尝试过各种在线示例,但不能完全正确地“展平”数据 设备有很多米 结果列表必须是DeviceHierarchyDataItem的展开列表 代码如下所示: 我猜我走错路了 public IQueryable<DeviceHierarchyDataItem> Query(int circuitConnectId) { var devices = (from device in UnitOfWork.Device

我使用的是一个树控件,需要在将数据交给控件之前将其展平。我尝试过各种在线示例,但不能完全正确地“展平”数据

设备有很多米 结果列表必须是DeviceHierarchyDataItem的展开列表 代码如下所示: 我猜我走错路了

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中有属性,那么我在同一个匿名对象中创建了所有属性。