2010-05-18 4 views
2

Je regardais quelques exemples dans le site de Microsoft à propos de linq et je vois un exemple que j'ai besoin de modifier!SelectMany dans Linq à entité

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); 
} 

Insted d'avoir une sélection qui retrives le CustomerID, et OrderID OrderDate Je veux choisir le CustomerID et un System.Collection.Generic.List<int> qui contient toutes les commandes pour cet utilisateur! Essentiellement, je veux regrouper mes commandes par CustomerID, mais j'ai remarqué que linq to entity ne permet pas un .ToList(object) à l'intérieur du select.

Je veux quelque chose comme ça ...

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(), 
    }; 

... mais le .ToList() est un gros problème, du moins pour moi.

J'essaye de trouver la solution pour cela mais jusqu'ici je n'ai rien accompli!

S'il vous plaît aidez-moi.

+0

Quel est le problème avec le "ToList"? –

+0

.ToList() à l'intérieur d'un select in linq to entity ne semble pas fonctionner! – Brazeta

Répondre

0

Avez-vous eu la possibilité de grouper par clause? Faites-moi savoir si ce n'est pas ce que vous recherchiez.

0

Essayez:

commandes var = (de c dans les clients de o c.Orders où o.OrderDate> = new DateTime (1998, 1, 1) sélectionner une nouvelle xpto { TheCostumerID = c.ID client,
CostumerOrders = o.Sélectionnez (i => i.OrderID) }). ToList();

+0

mais le résultat de cette requête est une liste d'objets avec un int et un IEnumerable à l'intérieur! Je veux que le résultat soit une liste avec un int et une liste à l'intérieur! Vous voyez mon problème maintenant? – Brazeta

0

J'ai trouvé la syntaxe plus fonctionnelle pour être plus concis, mais je me sers de GroupBy comme ceci:

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) 
    }); 

Et puis en utilisant ToList() pour sortir de LINQ à entités et dans LINQ-to-objects (avec un oeil sur comment cela affecte les requêtes SQL réelles allant à votre base de données, bien sûr):

return ordersEntities.ToList() 
    .Select(oe => new { 
     Customer = oe.Customer, 
     Orders = oe.ToList() 
    }); 
Questions connexes