Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

LINQ из выражения в точечную нотацию

#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();

Комментариев нет:

Отправить комментарий