Сведение сложных данных в один объект - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь абстрагировать данные от комплекса и создать EventDto. И я смог сделать это с помощью foreach, но синтаксис ужасен. Есть ли лучший способ написания этого кода?

 public class EventDtO
 {
    public string Id { get; set; }
    public string Title { get; set; }
    public string CategoryTitle { get; set; }
    public DateTime DateTime { get; set; }
  }

Это сложный объект, из которого я пытаюсь получить данные от

public class RootObject
{ 
    public List<Event> Events { get; set; }
}

public class Event
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Link { get; set; }
    public List<Category> Categories { get; set; }
    public List<Geometry> Geometries { get; set; }
}

public class Geometry
{
    public DateTime Date { get; set; }
    public string Type { get; set; }
    public List<object> Coordinates { get; set; }
}

    public class Category 
{ 
    public int Id { get; set; }
    public string Title { get; set; }
}

Требуемое отношение сопоставления:

EventDto.Id-> Событие .Я бы EventDto.Title-> Event.Title Event.CategoryTitle-> Category.Title Event.DateTime-> Geometry.Date

Класс Category будет содержать только одно значение, но geometry.ate может иметь несколько значений.

Итак, я хочу получить следующий вывод:

Название категории Дата
"Айсберг B42" Море и Ледяной Лед 2020-04-23T14: 24: 00Z
"Айсберг B42" Море и Ледяной Лед 2017-09-15T00: 00: 00Z

Я могу получить правильный информация, если я сделаю следующий код.

var Event = new List<EventDTO>();
foreach (var con in content.Events)
{
    var data = new EventDTO
    {
        Title = con.Title,
        Id = con.Id
    };

    foreach (var cat in con.Categories)
    {
        data.CategoriesTitle = cat.Title;
    }

    foreach (var geo in con.Geometries)
    {
        data.DateTime = geo.Date;
        Event.Add(data);
    }
}

Пример json

   {
        "id": "EONET_2881",
        "title": "Iceberg B42",
             "description": "",
        "categories": [
            {
                "id": 15,
                "title": "Sea and Lake Ice"
            }
        ]
        "geometries": [
            {
                "date": "2017-04-21T00:00:00Z",
                "type": "Point", 
                "coordinates": [ -107.19, -74.63 ]
            },
            {
                "date": "2017-09-15T00:00:00Z",
                "type": "Point", 
                "coordinates": [ -107.11, -74.08 ]
            }
        ]
    }

1 Ответ

0 голосов
/ 26 апреля 2020

Вы не создавали новый EventDTO для каждой геометрии. Не приведет ли это к нескольким записям с датой последней? Это то, что вы ищете;

var Event = content.Events.SelectMany(con => 
    con.Geometries.Select(geo => 
        new EventDTO
        {
            Title = con.Title,
            Id = con.Id,
            CategoriesTitle = con.Categories.FirstOrDefault().Title,
            DateTime = geo.Date
        })
    ).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...