SelectMany в Linq to entity

Я просматривал некоторые примеры на сайте Microsoft о linq и вижу пример, который мне нужно изменить!

http://msdn.microsoft.com/en-us/vcsharp/aa336758.aspx#SelectManyCompoundfrom3

public void Linq16()
{
List<Customer> customers = GetCustomerList();

var orders =
    from c in customers
    from o in c.Orders
    where o.OrderDate >= new DateTime(1998, 1, 1)
    select new { c.CustomerID, o.OrderID, o.OrderDate };

ObjectDumper.Write(orders);
}

Вместо выбора, который извлекает CustomerID, OrderID и OrderDate, я хочу выбрать CustomerID и System.Collection.Generic.List<int>, который содержит все заказы для этого пользователя! По сути, я хочу сгруппировать свои заказы по идентификатору клиента, но я заметил, что linq to entity не допускает .ToList(object) внутри выбора.

Я хочу что-то вроде этого...

List<Customer> customers = GetCustomerList();

var orders =
    from c in customers
    from o in c.Orders
    where o.OrderDate >= new DateTime(1998, 1, 1)
    select new xpto
    {
      TheCostumerID = c.CustomerID, 
      CostumerOrders = o.Select(i=>i.OrderID).ToList(),
    };

... но .ToList() - большая проблема, по крайней мере, для меня.

Я пытаюсь найти решение для этого, но пока ничего не добился!

Пожалуйста помогите.


person Brazeta    schedule 18.05.2010    source источник
comment
В чем проблема с ToList?   -  person CARLOS LOTH    schedule 18.05.2010
comment
.ToList() внутри выбора в linq to entity, похоже, не работает!   -  person Brazeta    schedule 24.05.2010


Ответы (3)


У вас была возможность сгруппировать по пункту?

 from orders in context.Orders
 group orders by orders.CustomerID into ordersGroup
 select new { CustomerID = ordersGroup.Key, 
              Orders = ordersGroup };

Дайте мне знать, если это не то, что вы искали.

person CARLOS LOTH    schedule 18.05.2010

Пытаться:

var orders = (из c в клиентах из o в c.Orders, где o.OrderDate >= new DateTime(1998, 1, 1) select new xpto { TheCustomerID = c.CustomerID,
CostumerOrders = o.Select(i= >i.OrderID) }).ToList();

person Jordan    schedule 18.05.2010
comment
но результатом этого запроса является список объектов с int и IEnumerable‹int› внутри! Я хочу, чтобы результатом был список с int и List‹int› внутри! Теперь вы видите мою проблему? - person Brazeta; 24.05.2010

Я нашел более функциональный синтаксис более кратким, но я бы использовал GroupBy следующим образом:

DateTime minDate = new DateTime(1998, 1, 1);

ordersEntities = entities.Customers.GroupJoin(entities.Orders, // Table to join with
    customer => customer.Id, order => order.CustomerId, // Properties to match on
    (customer, orders) => new {
        Customer = customer,
        Orders = orders.Where(o => o.Date > minDate)
    });

А затем с помощью ToList() для выхода из LINQ-to-entities и LINQ-to-objects (конечно, с учетом того, как это повлияет на фактические SQL-запросы, идущие к вашей базе данных):

return ordersEntities.ToList()
    .Select(oe => new {
        Customer = oe.Customer,
        Orders = oe.ToList()
    });
person John    schedule 19.11.2012