2011-07-07 32 views
9

Tôi đang gặp sự cố. Tôi không thể hiểu câu trả lời hiện có cho điều này trên Stack Overflow và quá mới để LINQ to SQL để có thể hạt nó ra bản thân mình.Chuyển đổi nhóm SQL đơn giản thành LINQ to SQL

Xem SQL này:

select p.Name as ProductName, SUM(o.NumberOf) as TotalOrdered from [Order] o 
    join [Product] p on o.ProductId = p.Id 
    group by p.Name 

Trả về một bảng 2 cột đẹp với tên sản phẩm ở bên trái và tổng số rằng sản phẩm đã được đặt hàng (trên tất cả các đơn đặt hàng) ở cột bên phải. Làm thế nào tôi có thể lặp lại điều này trong LINQ to SQL?

Dưới đây là những gì tôi đã có cho đến nay:

var ctx = new DataClasses1DataContext(); 
var totalProducts = (from o in ctx.Orders 
        join p in ctx.Products on o.ProductId equals p.Id 
        select new { p.Name, o.NumberOf }) 
    .GroupBy(t => t.Name) 
    .Select(g => g.Key, ...); 

gì đi tại ...?

Trả lời

25

Có vẻ với tôi như bạn muốn:

.Select(g => new { ProductName = g.Key, TotalOrdered = g.Sum(x => x.NumberOf) }) 

Bạn có thể làm toàn bộ truy vấn của bạn là một trong hai một biểu thức truy vấn đơn lẻ hoặc hoàn toàn không sử dụng biểu thức truy vấn:

var totalProducts = ctx.Orders 
         .Join(ctx.Products, o => o.ProductId, p => p.Id, 
          (o, p) => new { p.Name, o.NumberOf }) 
         .GroupBy(t => t.Name, 
           pair => pair.Name, // Key selector 
           pair => pair.NumberOf, // Element selector 
           (key, numbers) => new { 
            ProductName = key, 
            TotalOrdered = numbers.Sum()) 
           }); 

Hoặc:

var totalProdcuts = from o in ctx.Orders 
        join p in ctx.Products on o.ProductId equals p.Id 
        group o.NumberOf by p.Name into g 
        select new { ProductName = g.Key, TotalOrdered = g.Sum() }; 
+0

Điều này là chính xác. Vừa kiểm tra. Cảm ơn vì đã giúp tôi trong khoảnh khắc chết não của tôi. – Lisa

+1

@Lisa: Ok - sẽ chỉnh sửa thêm ... –

+0

Để trả lời cập nhật của bạn, tôi đã nhóm theo Tên. – Lisa

2
TotalOrdered = g.Sum(o => o.NumberOf) 

làm sử dụng trên cho .... hơn tuyên bố có thể

select new { ProductName= g.Key, TotalOrdered = g.Sum(o => o.NumberOf) }; 

var query = from o in ctx.Orders 
      join p in ctx.Products on 
      o.ProductId equals p.Id 
      group o by new { p.Name, o.NumberOf } into g 
      select new { ProductName= g.Key, TotalOrdered = g.Sum(o => o.NumberOf) }; 
+0

Tôi hiểu cách lấy tổng. Điều khiến tôi bối rối là làm thế nào để biến nó thành một phép chiếu. – Lisa

+0

@Lisa - hãy thử ngay bây giờ –

+0

Có điều này cũng hoạt động hoàn hảo. Tôi nghĩ đó là những gì tôi đang tìm kiếm ngay từ đầu. Nó thanh lịch hơn nhiều so với kết hợp các phần mở rộng LINQ-to-SQL và LINQ. – Lisa

0

Chỉ cần dán này ở đây trong trường hợp nó là hữu ích để biết làm thế nào điều này có thể đạt được thông qua phương pháp GroupJoin:

var totalProducts = ctx.Products.GroupJoin(ctx.Orders, 
    outerKeySelProduct => outerKeySelProduct.Id, 
    innerKeySelOrder => innerKeySelOrder.ProductId, 
    (outerKeySelProduct, innerKeySelOrder) => new 
    { 
     ProductName = outerKeySelProduct.Name, 
     TotalOrdered = innerKeySelOrder.Select(n => n.NumberOf).Sum() 
    }); 

Chúc mừng cho nó để được chỉnh sửa nếu nó có thể được cải thiện.