2010-10-18 156 views
10

我使用LINQ战斗努力学习语法和组,我无法弄清楚如何做到以下几点简单的查询简单的SQL到LINQ查询与聚合函数

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 

任何把这个帮助进入linq会很好。

回答

15

你后的查询应该是相当接近这个:

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(), 
    }; 

享受!

+1

谢谢。我一直在争取一段时间,因为我无法弄清楚如何让团队和invoice.amount一起工作,但这似乎是一个窍门,至少在使用LinqPad的时候是有效的 – cdmdotnet 2010-10-18 03:28:47

0

哎这个网站可以帮助你:

101 Linq Samples

拥有的大部分功能LINQ的例子,如果你不弄清楚,我可以为你以后如果有人不写。

+0

是的,我看到了视线,混淆了地狱了我,似乎造成比提供的答案更多的混乱。不管怎么说,多谢拉。 – cdmdotnet 2010-10-18 03:22:09

0

我认为你的联接条款存在差异 - 你是在user_id上自己加入发票的内在。我假设你打算加入这个用户?

在任何情况下,这是我最好的拍摄:

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) 
} 

至于LINQ的建议,我肯定会建议你下载和玩LINQPad。我一直使用它来在没有Visual Studio的情况下测试LINQ语句。它也会将你的LINQ语句转换为SQL,这可能是你特别感兴趣的。

编辑: Enigmativity的声明比我的要求更接近您的要求。我没有偶然发现与我合作的例子中的列组。

4

由于运提到学习语法,这里有一个流畅的版本:

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()