2012-09-06 30 views
5

Tôi đang cố gắng đếm số phụ huynh không có con và cha mẹ con. Như tôi đã viết những dòng này tôi nhận ra nó là tốt hơn giải thích với mã .. Vì vậy, ở đây nó đi:Đếm số liên kết cha mẹ làm phẳng trong LINQ

Với các loại ví dụ:

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

Và dữ liệu này:

var customers = new List<Customer> 
{ 
    new Customer 
    { 
     Id = 2, 
     Name = "Jane Doe" 
    }, 
    new Customer 
    { 
     Id = 1, 
     Name = "John Doe", 
     Orders = new List<Order> 
     { 
      new Order { Id = 342, Description = "Ordered a ball" }, 
      new Order { Id = 345, Description = "Ordered a bat" } 
     } 
    } 
}; 

// I'm trying to get a count of customer orders added with customers with no orders 
// In the above data, I would expect a count of 3 as detailed below 
// 
// CId  Name  OId 
// ----  -------- ---- 
// 2  Jane Doe 
// 1  John Doe 342 
// 1  John Doe 345 

int customerAndOrdersCount = {linq call here}; // equals 3 

tôi đang cố gắng để có được một số 3 trở lại.

Cảm ơn bạn trước sự giúp đỡ của bạn.

-Jessy Houle

thêm vào sau:

Tôi đã thực sự ấn tượng với tất cả các câu trả lời tuyệt vời (và nhanh chóng). Đối với những người khác đến câu hỏi này, tìm kiếm một vài lựa chọn, đây là một bài kiểm tra đơn vị với một vài ví dụ làm việc từ bên dưới.

[TestMethod] 
public void TestSolutions() 
{ 
    var customers = GetCustomers(); // data from above 

    var count1 = customers.Select(customer => customer.Orders).Sum(orders => (orders != null) ? orders.Count() : 1); 
    var count2 = (from c in customers from o in (c.Orders ?? Enumerable.Empty<Order>()).DefaultIfEmpty() select c).Count(); 
    var count3 = customers.Sum(c => c.Orders == null ? 1 : c.Orders.Count()); 
    var count4 = customers.Sum(c => c.Orders==null ? 1 : Math.Max(1, c.Orders.Count())); 


    Assert.AreEqual(3, count1); 
    Assert.AreEqual(3, count2); 
    Assert.AreEqual(3, count3); 
    Assert.AreEqual(3, count4); 
} 

Một lần nữa, cảm ơn tất cả vì sự giúp đỡ của bạn!

+1

+1 để cung cấp mã kiểm tra hữu ích. – sloth

Trả lời

5

Làm thế nào về

int customerAndOrdersCount = customers.Sum(c => c.Orders==null ? 1 : Math.Max(1, c.Orders.Count())); 
+1

Có lẽ tôi đã bỏ lỡ một phần câu hỏi, nhưng tại sao lại là 'Math.Max'? –

+0

Tôi nghĩ rằng tôi có thể tự trả lời câu hỏi của mình: vì 'Orders.Count()' có thể là 0 nhưng nó phải được tính là 1 (vì tất cả khách hàng sẽ được tính). +1 –

+0

Trong ngành công nghiệp, tốc độ ra thị trường là rất quan trọng. Cảm ơn bạn đã phản hồi nhanh chóng. –

0

Bạn probabbly tìm kiếm một cái gì đó như thế này:

customers.GroupBy(customer=>customer). //group by object iyself 
     Select(c=>      //select 
        new 
        { 
         ID = c.Key.Id,        
         Name = c.Key.Name, 
         Count = (c.Key.Orders!=null)? c.Key.Orders.Count():0 
        } 
       ); 
1

Nếu bạn muốn khởi tạo rằng tài sản với danh sách trống thay vì một null thứ tự, bạn có thể làm:

int count = 
    (
    from c in customers 
    from o in c.Orders.DefaultIfEmpty() 
    select c 
).Count(); 

Nếu bạn quyết định giữ tài sản chưa được khởi tạo xung quanh, sau đó thay vì làm:

int count = 
    (
    from c in customers 
    from o in (c.Orders ?? Enumerable.Empty<Order>()).DefaultIfEmpty() 
    select c 
).Count(); 
1
customers 
    .Select(customer => customer.Order) 
    .Sum(orders => (orders != null) ? orders.Count() : 1) 
0
var orderFreeCustomers = customers.Where(c=>c.Orders== null || c.Orders.Any()==false); 

var totalOrders = customers.Where (c => c.Orders !=null). 
Aggregate (0,(v,e)=>(v+e.Orders.Count) ); 

Kết quả là tổng của hai giá trị

1

này hoạt động nếu bạn muốn đếm "không đơn đặt hàng " làm 1 và đếm các đơn đặt hàng khác:

int customerOrders = customers.Sum(c => c.Orders == null ? 1 : c.Orders.Count()); 

Bởi wa y, câu hỏi là rất mẫu mực.

Các vấn đề liên quan