2009-02-09 34 views
14

Làm cách nào để viết một lựa chọn phụ trong LINQ.Linq Sub-Select

Nếu tôi có danh sách khách hàng và danh sách đơn đặt hàng, tôi muốn tất cả khách hàng không có đơn đặt hàng.

Đây là nỗ lực mã giả của tôi:

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

Trả lời

22

Làm thế nào về:

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

Một lựa chọn khác là sử dụng:

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

Bạn đang sử dụng LINQ to SQL hay cái gì khác, btw ? Các hương vị khác nhau có thể có các cách "tốt nhất" khác nhau để làm điều đó

+0

Không sử dụng Bất kỳ() thay vì Đếm() tốt hơn một chút về khả năng đọc? Đã đọc Bill C của hiệu quả hơn C# và đây là một trong những khuyến nghị. –

+2

Có, khá có thể. Rất nhiều cách để làm điều đó. Có thể cho rằng sẽ tốt hơn nếu có một phương thức mở rộng Empty() hoặc None() ngược lại với Any() ... –

+0

Vâng, ý tưởng hay. –

7

Nếu đây là cơ sở dữ liệu sao lưu, hãy thử sử dụng tính chuyển hướng (nếu bạn có chúng được định nghĩa):

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

On Northwind, điều này tạo ra 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] 
    )) 

Công việc nào khá tốt.

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

hoặc Make Trừ()

-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

Thêm giải thích –