Зациклить массив с вложенным выбором LINQ

У меня есть следующая структура данных (просто примерное визуальное представление):

list<customer>
{
    customer
    {
        name
        orders[]
        {
            order
            {
                quantity
                product
                {
                    price
                }
            }
            order
            {
                ...
            }
            order
            {
                ...
            }
    }
    customer
    {
        ...
    }
    customer
    {
        ...
    }
}

И я хочу получить имя каждого клиента и общую сумму его заказов (кол-во*цена товара). Теперь у меня есть следующее:

var sumEachCust = from c in customers
                  let sum = 0.0m
                  select new
                  {
                     c.Name,
                     sum =+ (from o in c.Orders
                             select o.Product.Price * o.Quantity).FirstOrDefault()
                  };    

Если объект Customer имеет более одной записи Order в своем Orders[], то мне нужна сумма всех записей внутри. Но с этим запросом я получаю сумму только для первого заказа.

Если я сделаю это так:

var sumEachCust = from c in customers
                  let sum = 0.0m
                  from o in c.Orders
                  select new
                  {
                    c.Name,
                    sum =+ o.Product.Price * o.Quantity
                  };

тогда я буду получать имя столько раз, сколько есть объектов заказа в свойстве Orders[] объекта Customer, а я этого не хочу.

Просто - сразу имя и сумма всех заказов.


person Milkncookiez    schedule 29.09.2014    source источник


Ответы (1)


from c in customers
select new
{
     Name = c.name,
     OrderTotal = c.orders.Sum(o => o.product.price * o.quantity)
}

Если вы действительно хотите использовать let, то вот как это сделать для этого сценария.

from c in customers
let sum = c.orders.Sum(o => o.product.price * o.quantity)
select new
{
    Name = c.name,
    OrderTotal = sum
}
person James    schedule 29.09.2014
comment
Работает и является действительно чистым и простым решением! Большое спасибо! Тем не менее, не могли бы вы привести пример использования let и временной переменной в запросе, так как я шел по этому пути и хотел бы посмотреть, как правильно использовать вложенный оператор select в этом случае? - person Milkncookiez; 29.09.2014
comment
@Milkncookiez смотрите обновление, хотя вам вообще не нужно использовать let здесь. - person James; 29.09.2014
comment
извините, я хотел спросить о примере с nested select, потому что, например, если мне нужно суммировать заказы всех клиентов вместе в одну общую сумму (вместо суммирования заказов каждого клиента отдельно), то как бы я это сделал ? (учитывая, что я не совсем уверен, как использовать логику итерации вложенного запроса). - person Milkncookiez; 29.09.2014
comment
@Milkncookiez, чтобы вернуть сумму всех записей, тогда вы можете просто выполнить let sum = customers.Sum(x => x.orders.Sum(o => o.product.price * o.quantity)) - хотя это приведет к отдельному запросу. - person James; 29.09.2014