2009-02-09 11 views
14

Come scrivere una sottoselezione in LINQ.Sottoselezione Linq

Se ho un elenco di clienti e un elenco di ordini voglio tutti i clienti che non hanno ordini.

Questo è il mio tentativo pseudo codice:

var res = from c in customers 
where c.CustomerID ! in (from o in orders select o.CustomerID) 
select c 

risposta

22

ne dite:

var res = from c in customers 
      where !orders.Select(o => o.CustomerID).Contains(c.CustomerID) 
      select c; 

Un'altra opzione è quella di utilizzare:

var res = from c in customers 
      join o in orders 
       on c.CustomerID equals o.customerID 
       into customerOrders 
      where customerOrders.Count() == 0 
      select c; 

Si sta utilizzando LINQ to SQL o qualcosa d'altro, btw ? Diversi sapori possono avere diversi modi "migliori" per farlo

+0

Non sta usando Any() invece di Count() leggermente migliore in termini di leggibilità? Era la lettura di Più efficace C# di Bill Wagner e questo era uno dei consigli. –

+2

Sì, molto probabilmente. Un sacco di modi per farlo. Probabilmente sarebbe bello avere un metodo di estensione Empty() o None() che è l'opposto di Any() troppo ... –

+0

Sì, buona idea. –

7

Se questa è la base di dati-backed, provare a utilizzare le proprietà di navigazione (se li avete definiti):

var res = from c in customers 
      where !c.Orders.Any() 
      select c; 

Su Northwind, questo genera il TSQL:

SELECT /* columns snipped */ 
FROM [dbo].[Customers] AS [t0] 
WHERE NOT (EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM [dbo].[Orders] AS [t1] 
    WHERE [t1].[CustomerID] = [t0].[CustomerID] 
    )) 

Quale funziona abbastanza bene.

-2
var res = (from c in orders where c.CustomerID == null 
       select c.Customers).ToList(); 

O Fai Salvo()

-1
  var result = (from planinfo in db.mst_pointplan_info 
                  join entityType in db.mst_entity_type 
                  on planinfo.entityId equals entityType.id 
                  where planinfo.entityId == entityId 
                  && planinfo.is_deleted != true 
                  && planinfo.system_id == systemId 
                  && entityType.enity_enum_id == entityId 
                  group planinfo by planinfo.package_id into gplan 
                  select new PackagePointRangeConfigurationResult 
                  { 
                   Result = (from planinfo in gplan 
                     select new PackagePointRangeResult 
                     { 
                      PackageId = planinfo.package_id, 
                      PointPlanInfo = (from pointPlanInfo in gplan 
                           select new PointPlanInfo 
                           { 
                            StartRange = planinfo.start_range, 
                            EndRange = planinfo.end_range, 
                            IsDiscountAndChargeInPer = planinfo.is_discount_and_charge_in_per, 
                            Discount = planinfo.discount, 
                            ServiceCharge = planinfo.servicecharge, 
                            AtonMerchantShare = planinfo.aton_merchant_share, 
                            CommunityShare = planinfo.community_share 
                           }).ToList() 
                     }).ToList() 
                  }).FirstOrDefault(); 
+1

Aggiungi spiegazione –