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

157
17 сентября 2018, 17:10

Есть классы моделей

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<Order>>, а мне необходим IEnumerable<Customers>. Скажите пожалуйста в каком месте я ошибаюсь, и как делать запросы подобного вида правильно.

Answer 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, так как он возвращает новую коллекцию.

Answer 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();
READ ALSO
Как десериализовать такой JSON (в Visual Studio)? [дубликат]

Как десериализовать такой JSON (в Visual Studio)? [дубликат]

На данный вопрос уже ответили:

179
Конструктор Android в Visual Studio

Конструктор Android в Visual Studio

Решил сделать программку на шарпе для андроидДобавил в VS installer все инструменты для андроид розработки

201
Конвертация бинарного int в hex int

Конвертация бинарного int в hex int

К примеру, у меня есть число:

165
Заполнение datagridview по вертикально (C# winforms)

Заполнение datagridview по вертикально (C# winforms)

В datagridview можно заполнять по горизонтально, но как заполнить вертикалноУ меня есть столбцы называется "Кабинка 1", "Кабинка 2" и

180