#c_sharp #net #linq #лямбда_выражение
Есть классы моделей public class Product { public int ProductID { get; set; } public string ProductName { get; set; } public string Category { get; set; } public decimal UnitPrice { get; set; } public int UnitsInStock { get; set; } } public class Order { public int OrderID { get; set; } public DateTime OrderDate { get; set; } public decimal Total { get; set; } } Необходимо получить всех клиентов, у которых были заказы, превосходящие по сумме величину value Я сделал следующий запрос var customers = from c in dataSource.Customers from o in c.Orders where o.Total > value select c).Distinct(); Выводит то что нужно. Необходимо выполнить данный запрос в точечной нотации, я пытаюсь сделать так: var customers = dataSource.Customers.Select(c => c.Orders .Where(o => o.Total > value)) .Distinct(); и получается, что запрос возвращает IEnumerable>, а мне необходим IEnumerable . Скажите пожалуйста в каком месте я ошибаюсь, и как делать запросы подобного вида правильно.
Ответы
Ответ 1
Вам нужно написать так: var customers = dataSource.Customers.Where(c => c.Orders.Any(o => o.Total > value)).Distinct(); Если нужно чтобы хотя бы один заказ больше value, или так: var customers = dataSource.Customers.Where(c => c.Orders.All(o => o.Total > value)).Distinct(); Если нужно чтобы все заказы больше value. В данном случае не стоит использовать метод Select, так как он возвращает новую коллекцию.Ответ 2
Два from подряд, в query форме соответствуют методу SelectMany Запрос может принять вид: var customers = dataSource.Customers .SelectMany(c => c.Orders, (c,o) => new {c, o}) .Where(item => item.o.Total > value) .Select(item => item.c) .Distinct();
Комментариев нет:
Отправить комментарий