LINQ Sub-selection - PullRequest
       4

LINQ Sub-selection

0 голосов
/ 07 декабря 2018

Я студент, новичок в LINQ, и нам дали задание для работы с запросами LINQ.

Моя проблема в том, что в последние дни я изо всех сил пытался найти правильный способВыполните этот шаг: напечатайте имя клиента с надписью «Молоко» в своих заказах.

Write a LINQ query to select all customers buying milk.
Print the Name of each customer in the query.

Ради времени, вот структура данных, чтобы вы могли ее понять:

        Product milk    = new Product { Name = "Milk",    Price = 13.02m };
        Product butter  = new Product { Name = "Butter",  Price = 8.23m };
        Product bread   = new Product { Name = "Bread",   Price = 17.91m };
        Product cacao   = new Product { Name = "Cacao",   Price = 25.07m };
        Product juice   = new Product { Name = "Juice",   Price = 17.03m };

        Customer c1 = new Customer { Name = "x", City = "g", Orders = new Order[] {
               new Order { Quantity = 2, Product = milk     },
               new Order { Quantity = 1, Product = butter   },
               new Order { Quantity = 1, Product = bread    }
            }
        };

        Customer c2 = new Customer { Name = "y", City = "g", Orders = new Order[] {
                new Order { Quantity = 1, Product = cacao   },
                new Order { Quantity = 1, Product = bread   },
                new Order { Quantity = 2, Product = milk    },
                new Order { Quantity = 2, Product = butter  },
            }
        };

        Customer c3 = new Customer { Name = "z", City = "g",  Orders = new Order[] {
                new Order { Quantity = 3, Product = juice   }
            }
        };

        Customer[] customers = new Customer[] { c1, c2, c3 };

В качестве примера синтаксиса, который я использую с LINQ, приведу ссылку на рабочий код:

        var QueryCustomerByCity = from cus in customers.AsEnumerable()
                                     where cus.City == "g"
                                     select cus;

        foreach (Customer c in QueryCustomerByCity)
            Console.WriteLine("Customer {0} lives in {1}", c.Name, c.City);

Я действительно очень стараюсь понять, что происходит, поэтому, если вы можете помочьмне, пожалуйста, объясните мне, как вы пришли к такому выводу:)

Большое спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Запрос LINQ - это конвейер: данные в потоке, элемент за элементом, переходят от одного предложения к другому.Из некоторого источника данных вы можете получить поток элементов (например, через AsEnumerable).Из потока элементов вы можете фильтровать по некоторому предикату (функция для элемента, возвращающего логическое значение), оставляя в потоке только те элементы, которые предикат принимает (возвращает true), и отбрасывая остальные.Фильтр называется WHERE, а предикат является остальной частью предложения WHERE, например, WHERE cus.City == "G".А также, из элементов в потоке, вы можете выбрать одно поле, изменяя поток от потока (исходного) элемента к потоку поля.Это SELECT, как в SELECT g.City, где поток будет меняться от потока клиентов к потоку строк (каждая из которых была названием города).

Из этого (и других пунктов LINQ, которые выможно узнать) вы можете построить любой конвейер данных, который вы хотите.В частности, тот, который возвращает поток имен клиентов, учитывая, что клиент заказал молоко.

0 голосов
/ 07 декабря 2018

Ваш текущий запрос:

var QueryCustomerByCity = from cus in customers.AsEnumerable() //for each customer in customers 
                          where cus.City == "g" // where the Customer is from the City "g"
                          select cus; // select the customer

читается как "для каждого клиента, представленного как cus в массиве customers, где город клиентов равен" g ", затем сохраните клиента".Таким образом, в результате у вас будет последовательность клиентов, где их Город - "g".

Что касается вашей задачи, то вам нужно следующее:

var result = from cus in customers // for each customer in customers                  
             where cus.Orders.Any(o => o.Product.Name == "Milk") // where the product name is "Milk"
             select cus; // select the customer

Это по существупросматривает клиентов в массиве customers и проверяет их заказы, и если есть какой-либо продукт с именем «Молоко», сохраняет этого конкретного клиента.

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