2010-10-18 56 views
10

Tôi đang chiến đấu với LINQ cố gắng tìm hiểu cú pháp và tôi không thể tìm ra cách để làm các truy vấn đơn giản sau đâySimple sql để LINQ truy vấn với nhóm bằng và chức năng tổng hợp

SELECT DISTINCT 
    user.firstname, 
    user.lastname, 
    COUNT(invoice.amount), 
    SUM(invoice.amount) 
FROM 
    company_user 
    INNER JOIN 
     user 
    ON 
     company_user.user_id = user.user_id 
    INNER JOIN 
     invoice 
    ON 
     invoice.user_id= invoice.user_id 
WHERE 
    company_user.company_id = 1 
GROUP BY 
    user.firstname, 
    user.lastname, 
GO 

Bất kỳ sự giúp đỡ quay này vào linq sẽ là tuyệt vời.

Trả lời

15

Truy vấn bạn sau nên được khá gần với điều này:

var query = 
    from cu in company_user 
    where cu.company_id == 1 
    join u in user on cu.user_id equals u.user_id 
    join i in invoice on u.user_id equals i.user_id 
    group i.amount by new 
    { 
     u.firstname, 
     u.lastname, 
    } into gs 
    select new 
    { 
     firstname = gs.Key.firstname, 
     lastname = gs.Key.lastname, 
     count = gs.Count(), 
     sum = gs.Sum(), 
    }; 

Thưởng thức!

+1

Cảm ơn. Tôi đã chiến đấu với điều này trong một thời gian ngắn vì tôi không thể tìm ra cách để có được nhóm và invoice.amount để làm việc cùng nhau, nhưng điều này dường như làm các trick, ít nhất là trong khi sử dụng LinqPad nó hoạt động – cdmdotnet

0

hey trang web này có thể giúp bạn:

101 Linq Samples

có các ví dụ của hầu hết các chức năng LINQ, nếu u không tìm ra, tôi có thể viết cho bạn sau này nếu ai đó không.

+0

Vâng tôi thấy rằng thị giác, nhầm lẫn địa ngục ra khỏi tôi và dường như gây nhầm lẫn hơn cung cấp câu trả lời. Dù sao cũng cảm ơn. – cdmdotnet

0

Tôi nghĩ rằng bạn có sự khác biệt trong điều khoản tham gia - bạn đang tham gia bên trong hóa đơn vào chính nó trên user_id. Tôi cho rằng bạn dự định tham gia điều này với người dùng?

Trong mọi trường hợp, đây là bức ảnh đẹp nhất của tôi:

from inv in invoices 
group inv by new { inv.user_id } into userInv 
join usr in users on userInv.Key.user_id equals usr.user_id 
where usr.company_user.company_id = 1 
select new 
{ 
    usr.firstname, 
    usr.lastname, 
    amount = inv.Count(), 
    sum = inv.Sum(amt => amt.amount) 
} 

Đối với LINQ gợi ý, chắc chắn tôi muốn đề nghị bạn tải về và chơi xung quanh với LINQPad. Tôi sử dụng nó tất cả thời gian để kiểm tra các câu lệnh LINQ mà không cần Visual Studio. Nó cũng sẽ chuyển đổi các câu lệnh LINQ của bạn thành SQL, mà có lẽ bạn quan tâm đặc biệt.

Chỉnh sửa: Tuyên bố của Enigmativity gần giống với những gì bạn yêu cầu hơn tôi. Tôi đã không vấp vào nhóm cột trong các ví dụ tôi đã làm việc với.

4

Từ op đề cập việc học cú pháp, đây là một phiên bản thành thạo:

company_user 
    .Where(x => x.company_id == 1) 
    .Join(
     user, 
     x => x.user_id, 
     x => x.user_id, 
     (o,i) => new { 
      FirstName = i.firstName, 
      LastName = i.lastName, 
      InvoiceCount = invoice.Count(y => y.user_id == o.user_id), 
      InvoiceSum = invoice.Where(y => y.user_id == o.user_id).Sum(y => y.amount) 
     } 
    ).GroupBy(x => new { x.FirstName, x.LastName }) 
    .Distinct() 
Các vấn đề liên quan