2015-12-19 2 views
0

Итак, у меня есть некоторые данные, поставляемые как это:разбор данных в формате JSON с помощью LINQ

[ 
    { 
    "Name": "Jonh ", 
    "Order": [ 
     { 
     "Product": { 
      "Id": 8 
     }, 
     "Quantity": 1 
     }, 
     { 
     "Product": { 
      "Id": 19 
     }, 
     "Quantity": 8 
     } 
    ] 
    }, 
    { 
    "Name": "Jane Doe 1", 
    "Order": [ 
     { 
     "Product": { 
      "Id": 26 
     }, 
     "Quantity": 7 
     }, 
     { 
     "Product": { 
      "Id": 44 
     }, 
     "Quantity": 2 
     }, 
     { 
     "Product": { 
      "Id": 21 
     }, 
     "Quantity": 6 
     }, 
     { 
     "Product": { 
      "Id": 48 
     }, 
     "Quantity": 2 
     }, 
     { 
     "Product": { 
      "Id": 35 
     }, 
     "Quantity": 2 
     }, 
     { 
     "Product": { 
      "Id": 43 
     }, 
     "Quantity": 1 
     } 
    ] 
    } 
] 

ОБНОВЛЕНИЕ: JSON уже разбирается с NewtonSoft.Json.JsonConvert
Я новичок в Linq, я смог сделать это в JavaScript. Мне нужен запрос linq, который извлекает проданные товары, заказанные наиболее проданными;
так: он объединяет каждый продукт и суммирует проданное количество, а также заказы на сумму количеств.

Это то, что я есть сейчас:

var products = clientSales.SelectMany(m => m.Order).Select(f=>f.Product.Id).Distinct(); 

, который дает мне список различных productIds ...

+0

Какую технику разбора JSON вы используете? См. [Как разобрать JSON с C#?] (Http://stackoverflow.com/questions/6620165/how-can-i-parse-json-with-c) или [Что является простейшей функцией C# для анализа JSON string в объект?] (http://stackoverflow.com/questions/2859753) или [Может ли я LINQ JSON?] (http://stackoverflow.com/questions/18758361/can-i-linq-a-json). – dbc

+0

извините, пожалуйста, уточните мое обновление –

+1

Разработано для чего? Как выглядят ваши классы? – dbc

ответ

1

Вы почти правы, сначала вы должны использовать SelectMany в порядке, а затем в OrderByDescending Количество и, наконец, выбрать, чтобы получить идентификатор продукта, как код ниже:

var products = clientSales.SelectMany(m => m.Order) 
          .OrderByDescending(x => x.Quantity) 
          .Select(p => p.Product.Id) 
          .Distinct(); 

Выход:

19 
26 
21 
44 
48 
35 
8 
43 

Вы можете увидеть здесь работать: https://dotnetfiddle.net/6sb3VY

1

Предполагая, что вы имели следующие классы:

public class Customer 
{ 
    public string Name { get; set; } 
    public List<Item> Order { get; set; } 
} 
public class Item 
{ 
    public Product Product { get; set; } 
    public int Quantity { get; set; } 
} 
public class Product 
{ 
    public int Id { get; set; } 
} 

Вы можете получить список идентификаторов продукта и количество проданной упорядоченный по количеству сходящего с следующее:

string json = "[{\"Name\": \"Jonh \",\"Order\": [{\"Product\": {\"Id\": 8},\"Quantity\": 1},{\"Product\": {\"Id\": 19},\"Quantity\": 8}]},{\"Name\": \"Jane Doe 1\",\"Order\": [{\"Product\": {\"Id\": 26},\"Quantity\": 7},{\"Product\": {\"Id\": 44},\"Quantity\": 2},{\"Product\": {\"Id\": 21},\"Quantity\": 6},{\"Product\": {\"Id\": 48},\"Quantity\": 2},{\"Product\": {\"Id\": 35},\"Quantity\": 2},{\"Product\": {\"Id\": 43},\"Quantity\": 1}]}]"; 

var deserializedObject = JsonConvert.DeserializeObject<List<Customer>>(json); 

var groupedProducts = from product in deserializedObject.SelectMany(c => c.Order) 
         group product by product.Product.Id into grpProduct 
         select new 
         { 
          ProductId = grpProduct.Key, 
          Quantity = grpProduct.ToList().Sum(p => p.Quantity) 
         }; 

// Produces the ordered list of product IDs and quantity sold sorted by quantity descending 
var orderedProducts = groupedProducts.OrderByDescending(p => p.Quantity).ToList(); 

Это в конечном итоге производит следующий список анонимных объектов на основе вашего ввода:

Product ID  Quantity 
19    8 
26    7 
21    6 
44    2 
48    2 
35    2 
8    1 
43    1 
+0

Спасибо, я проверю его позже с моими настоящими данными –

+0

+1 Это даст правильный результат, когда несколько заказов имеют один и тот же продукт. Но я не понимаю, зачем вам нужно ... ... orderby grpProduct.Count() по убыванию ... 'в' groupedProducts'? – Sphinxxx

+0

@Sphinxxx Вы правы. Вам не требуется предложение orderby, так как упорядочение действительно выполняется в 'orderedProducts'. Я отредактировал свой ответ, чтобы удалить его. – Connor

Смежные вопросы