Linq convert SQL ответ от одного класса до вывода вложенного класса в группе по. net core - PullRequest
0 голосов
/ 25 мая 2020

Получен ответ в объекте от SQL, как показано ниже

output

Теперь нужно иметь самый быстрый способ преобразования данных во вложенный класс на основе Этаж, как показано ниже,

enter image description here

Созданная структура классов, как показано ниже,

enter image description here

Не уверен, как мне сделать группировку и сделать ее перечисляемой, не разделяя код, поскольку мне нужны свежие / более быстрые идеи.

Любая справочная ссылка или фрагмент кода примера будут полезны.

1 Ответ

1 голос
/ 26 мая 2020

Это должно сработать. Здания сгруппированы по BuildingId, а внутри каждой группы этажи сгруппированы по FloorId. Технически делегат группы этажей возвращает FloorHeader (который имеет 3 реквизита: идентификатор, имя этажа и код этажа), но реализация Equality FloorHeader зависит только от идентификатора. FloorHeader - это просто средство для включения имени и кода в группу (я предполагаю, что этажи с одинаковым идентификатором также имеют одинаковое имя и код).

public readonly struct FloorHeader : IEquatable<FloorHeader> {
    public FloorHeader(int id, string name, int floorCode) {
        Id = id;
        Name = name ?? throw new ArgumentNullException(nameof(name));
        FloorCode = floorCode;
    }

    public int Id { get; }
    public string Name { get; }
    public int FloorCode { get; }

    public bool Equals(FloorHeader other) => other.Id == Id;
    public override bool Equals(object obj) => obj is FloorHeader other && Equals(other);
    public override int GetHashCode() => Id;
}

public class Building {
    public int Id { get; set; }
    public IEnumerable<Floor> Floors { get; set; }

    public class Floor {
        public FloorHeader Header { get; set; }
        public IEnumerable<Cafe> Cafes { get; set; }

        public class Cafe {
            public int Id { get; set; }
            public string Label { get; set; }
            public double Area { get; set; }
        }
    }
}

public static IEnumerable<Building> ToBuildings(IEnumerable<Row> sql_reply) {
    // Equality of Building/FloorHeaders only depends on the id
    return sql_reply.GroupBy(row => row.BuildingId)
       .Select(building_rows =>
          new Building {
              Id = building_rows.Key,
              Floors = building_rows.GroupBy(row => new FloorHeader(row.FloorId, row.FloorName, row.FloorCode))
                .Select(floor_rows =>
                   new Building.Floor {
                       Header = floor_rows.Key,
                       Cafes = floor_rows.Select(cafe =>
                        new Building.Floor.Cafe {
                             Id = cafe.CafeId,
                             Label = cafe.CafeName,
                             Area = cafe.Area
                         })
                   })
          });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...