2009-02-09 18 views
14

Cómo escribo una sub-selección en LINQ.Linq Sub-Select

Si tengo una lista de clientes y una lista de pedidos, quiero todos los clientes que no tienen pedidos.

Este es mi código de pseudo intento:

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

Respuesta

22

¿Qué tal:

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

Otra opción es utilizar:

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

¿Está utilizando LINQ a SQL o alguna otra cosa, por cierto ? Diferentes sabores pueden tener diferentes "mejores" formas de hacerlo

+0

¿No está utilizando Any() en lugar de Count() un poco mejor en términos de legibilidad? Estaba leyendo el C# más efectivo de Bill Wagner y esta fue una de las recomendaciones. –

+2

Sí, muy posiblemente. Muchas formas de hacerlo. Podría decirse que sería bueno tener un método de extensión Empty() o None() que es lo contrario de Any() también ... –

+0

Sí, buena idea. –

7

Si esta es la base de datos respaldados, trate de usar las propiedades de navegación (si los tiene definidos):

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

En Neptuno, esto genera la 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] 
    )) 

Lo que hace bastante bien el trabajo.

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

O Hacer una excepción()

-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

Añadir explicación –