Prawidłowe zwrócenie listy obiektów w ładny sposób

0

Cześć, mam sytuację związaną ze zwróceniem listy obiektów, z którą nie mogę sobie poradzić.
W bazie danych mam kolumny 'identifier' oraz 'definition', gdzie 'definition' zawiera jsona w postaci stringa. W tej chwili zwrotkę buduję w następujący sposób:

return entity.Select(e => JsonConvert.DeserializeObject<T>(e.Definition));

I tutaj pojawia się mój problem- powyższy kod w zgrabny sposób robi mi ze stringa 'definition' jsona i go zwraca prawidłowo, jednak zwracany obiekt posiada również pole 'identifier', które w tym przypadku zawsze jest zwracane jako null, ponieważ jego wartość pochodzi z innej kolumny w tej tabeli. Moje pytanie brzmi jak w tym select'cie, którego robię jestem w stanie przypisać również wartość z bazy danych z kolumny 'identifier'? Niekoniecznie musi to być z użyciem selecta, jednak nie mam za bardzo pomysłu jak to zrobić. Ktoś podpowie?

2

które w tym przypadku zawsze jest zwracane jako null

ale gdzie jest ten null?


a nie takie coś?

Dla danych:

Identifier Definition
1 { "Dupa": "xd" }
public class Map<T>
{
    public int Id { get; set; }

    public T Definition { get; set; }
}

public class Test
{
    public string Dupa { get; set; }
}

public class Entity
{
    public int Identifier { get; set; }

    public string Definition { get; set; }
}
var entities = new List<Entity>() { new Entity { Identifier = 1, Definition = @"{""Dupa"": ""xd"" }" } };

var result = entities
            .Select(x => new Map<Test> { Id = x.Identifier, Definition = JsonConvert.DeserializeObject<Test>(x.Definition) })
            .ToList();

Console.WriteLine(result[0].Definition.Dupa); // prints "xd"
0

Nic w tym dziwnego skoro w mapowaniu nie robisz nic z identyfikatorem. Zrób tak jak to zrobił @WeiXiao:

WeiXiao napisał(a):

entities.Select(x => new Map<Test> { Id = x.Identifier, Definition = JsonConvert.DeserializeObject<Test>(x.Definition) }).ToList();

i przypisz identyfikator do obiektu w metodzie mapującej

0

@WeiXiao: Sorry, że odpisuje po takim czasie, ale chyba nie do końca o to mi chodziło. Nie chcę mieć tych dynamicznych danych zaszytych w propertiesie "Definition".
Może spróbuję to zaprezentować na konkretnym przykładzie.
W bazie danych pojedynczy obiekt wygląda następująco:

Identifier Definition
abc {"name": "dupa1", "class": "dupa2", "variables": [], "alerts": []}

I teraz jest taka sytuacja, że chce zwracać obiekt, który ma następujące pola:
identifier, class, variables - opcjonalnie w zależności od query, alerts - opcjonalnie w zależności od query.

No i generalnie nie mam z tym problemu, wszystko fajnie działa, tylko mam problem z tym identifierem, który w bazie danych siedzi w osobnej kolumnie, a nie w tym jsonie, którego deserializuję. Nie wiem w jaki sposób mogę go przypisać do mojego zwracane obiektu. Może teraz jaśniej przedstawiłem problem - podpowiesz co zrobić w takiej sytuacji?

0
public class Entity
{
    public int Identifier { get; set; }

    public string Definition { get; set; }
}
var entities = new List<Entity>() { new Entity { Identifier = 1, Definition = @"{""Dupa"": ""xd"", ""Variables"": [1,2,3] }" } };

var definitions = new List<dynamic>();

foreach (var entity in entities)
{
    var dynamic = JsonConvert.DeserializeObject<dynamic>(entity.Definition);
    dynamic.Identifier = entity.Identifier;
    definitions.Add(dynamic);
}

var combinedJson = JsonConvert.SerializeObject(definitions, Formatting.Indented);

Console.WriteLine(combinedJson);

Result:

[
  {
    "Dupa": "xd",
    "Variables": [
      1,
      2,
      3
    ],
    "Identifier": 1
  }
]
1

Ja bym zrobił tak:

var parsed=list.Select(c =>
            {
                var def = JObject.Parse(c.Def);
                def["Indentifier"] = c.Identifier;
                return def;
            });

1 użytkowników online, w tym zalogowanych: 0, gości: 1