Как использовать критерии множественного списка linq? - PullRequest
1 голос
/ 31 марта 2019

Я хочу заказать мульти-список в соответствии с условием, используя другие API.

Результат (я использую из других API)

{
    "returned_data": {
        "data": [
            {
                "firstName": "FirstNameAA",
                "lastName": "LastNameAA",
                "product": [
                    {
                        "license": "1AS131",
                        "carType": "478",
                        "contract": "0112345",
                        "amounttoCurrent": 3000
                    }               
                ]
            },
            {
                "firstName": "FirstNameAA",
                "lastName": "LastNameAA",
                "product": [
                    {
                        "license": "2AS345",
                        "carType": "465",
                        "contract": "10234521",
                        "amounttoCurrent": 12000
                    }
                ]
            },
            {
                "firstName": "FirstNameBB",
                "lastName": "LastNameBB",
                "product": [
                    {
                        "license": "kdf9034",
                        "carType": "4234",
                        "contract": "8995412",
                        "amounttoCurrent": 1000
                    }
                ]
            }
        ]
    }
}

Но я хочу новый результат,Новый порядок каждого списка по «firstName»

{
    "returned_data": {
        "data": [
            {
                "firstName": "FirstNameAA",
                "lastName": "LastNameAA",
                "product": [
                    {
                        "license": "1AS131",
                        "carType": "478",
                        "contract": "0112345",
                        "amounttoCurrent": 3000
                    },
                    {
                        "license": "2AS345",
                        "carType": "465",
                        "contract": "10234521",
                        "amounttoCurrent": 12000
                    }
                ]
            },            
            {
                "firstName": "FirstNameBB",
                "lastName": "LastNameBB",
                "product": [
                    {
                        "license": "kdf9034",
                        "carType": "4234",
                        "contract": "8995412",
                        "amounttoCurrent": 1000
                    }
                ]
            }
        ]
    }
}

Код c #

var newResult = resReturnListData.returned_data.data.GroupBy(x => x.firstName);  >>> not work.

Пожалуйста, помогите мне.спасибо в Advane.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Предполагая, что ваши структуры данных выглядят следующим образом,

public class Product
{
    public string license { get; set; }
    public string carType { get; set; }
    public string contract { get; set; }
    public int amounttoCurrent { get; set; }
}

public class Datum
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public List<Product> product { get; set; }
}

public class ReturnedData
{
    public List<Datum> data { get; set; }
}

public class RootObject
{
    public ReturnedData returned_data { get; set; }
}

Вы можете GroupBy получить результат «данных», а затем обернуть его, используя анонимный объект.

var resReturnListData = JsonConvert.DeserializeObject<RootObject>(jsonString);
var newResult = resReturnListData.returned_data.data
                .GroupBy(x => x.firstName)
                .Select(x => new Datum
                {
                    firstName = x.Key,
                    lastName = x.Select(c => c.lastName).FirstOrDefault(),
                    product = x.SelectMany(c => c.product).ToList()

                });

var finalObject = new RootObject
{
    returned_data = new ReturnedData
    {
        data = newResult.ToList()
    }
};

var jsonResult = JsonConvert.SerializeObject(finalObject,Newtonsoft.Json.Formatting.Indented);

Выходная выборка,

{
  "returned_data": {
    "data": [
      {
        "firstName": "FirstNameAA",
        "lastName": "LastNameAA",
        "product": [
          {
            "license": "1AS131",
            "carType": "478",
            "contract": "0112345",
            "amounttoCurrent": 3000
          },
          {
            "license": "2AS345",
            "carType": "465",
            "contract": "10234521",
            "amounttoCurrent": 12000
          }
        ]
      },
      {
        "firstName": "FirstNameBB",
        "lastName": "LastNameBB",
        "product": [
          {
            "license": "kdf9034",
            "carType": "4234",
            "contract": "8995412",
            "amounttoCurrent": 1000
          }
        ]
      }
    ]
  }
}
1 голос
/ 31 марта 2019

Вам нужно использовать правильную группу по, а затем выбрать только product из группы по результату,

var newResult = resReturnListData.returned_data.data
    .GroupBy(x => x.firstName)
    .Select(g => new
    {
        firstName = g.Key,
        lastName = g.Select(x => x.lastName).FirstOrDefault(),
        product = g.SelectMany(x => x.product).ToList()
    }).ToList();

Если вы хотите сгруппировать по вашим данным с помощью firstName и lastName, тогда

var newResult = resReturnListData.returned_data.data
    .GroupBy(x => new { x.firstName, x.lastName })
    .Select(g => new
    {
        firstName = g.Key.firstName,
        lastName = g.Key.lastName,
        product = g.SelectMany(x => x.product).ToList()
    }).ToList();

Использование:

string json = "Your json here";

JObject jObject = JObject.Parse(json);

RootObject resReturnListData = jObject.ToObject<RootObject>();

jObject["returned_data"]["data"] = JToken.FromObject(newResult);  //<= newResult comes from either one of above linq group by result

string newJson = jObject.ToString();

Console.WriteLine(newJson);

Выход: (с консоли)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...