SQL到Linq,在SUM和多列列组中遇到连接问题

时间:2015-08-15 12:51:54

标签: c# linq entity-framework join group-by

我希望下面的查询转换为linq,以便在MVC中进行分页。

SELECT tblInvoiceMaster.InvoiceNo,
         tblCompanyMaster.CompanyId,
         tblCompanyMaster.CompanyName,
         tblInvoiceMaster.InvoiceType,
         tblInvoiceMaster.InvoiceId,
         Sum(tblInvoiceItem.Quantity * tblProductMaster.Rate)    AS TotalPrice,
         CONVERT(VARCHAR(11), tblInvoiceMaster.InvoiceDate, 113) AS InvoiceDate
  FROM   tblCompanyMaster
         INNER JOIN tblInvoiceMaster
                 ON tblCompanyMaster.CompanyId = tblInvoiceMaster.CompanyId
         INNER JOIN tblInvoiceItem
                 ON tblInvoiceMaster.InvoiceId = tblInvoiceItem.InvoiceId
         INNER JOIN tblProductMaster
                 ON tblProductMaster.ProductId = tblInvoiceItem.ProductId
  GROUP  BY tblInvoiceMaster.InvoiceNo,
            tblCompanyMaster.CompanyId,
            tblCompanyMaster.CompanyName,
            tblInvoiceMaster.InvoiceDate,
            tblInvoiceMaster.InvoiceId,
            tblInvoiceMaster.InvoiceType

等效Linq查询:

                        (from company in DbContext.tblCompanyMasters
                        join invoice in DbContext.tblInvoiceMasters
                            on company.CompanyId equals invoice.CompanyId
                        join item in DbContext.tblInvoiceItems
                            on invoice.InvoiceId equals item.InvoiceId
                        join product in DbContext.tblProductMasters
                            on item.ProductId equals product.ProductId
                        //here I was having issue for group by columns from multiple tables
                        group new { company, invoice, item, product } by new
                        {
                            invoice.InvoiceNo,
                            invoice.InvoiceDate,
                            invoice.InvoiceId,
                            invoice.InvoiceType,
                            company.CompanyId,
                            company.CompanyName,

                        } into g
                        select new
                        {
                            g.Key.CompanyId,
                            g.Key.CompanyName,
                            g.Key.InvoiceNo,
                            g.Key.InvoiceType,
                            g.Key.InvoiceId,
                            g.Key.InvoiceDate,
                            Sum = g.Sum(o => o.item.Quantity * o.product.Rate)
                        }).ToList();

我遇到了多个列GROUP BY,这些列来自不同的表并在执行乘法时执行SUM,例如:

SUM(tblInvoiceItem.Quantity * tblProductMaster.Rate)

2 个答案:

答案 0 :(得分:3)

group new { company, invoice, product } by new
{
    invoice.InvoiceId,
    company.CompanyId
} into g
select new 
{
    Sum = g.Sum(o => o.invoice.Quantity * o.product.Rate)
}

等等......

答案 1 :(得分:1)

group子句返回一系列IGrouping<TKey, TElement>个对象,这些对象包含零个或多个与该组的键值匹配的项目。每个IGrouping<TKey, TElement>对象都有一个Key属性,其中存储了键值:

//...  
group new { company, invoice } by new
{
    invoice.InvoiceNo,
    invoice.InvoiceDate,
    invoice.InvoiceId,
    invoice.InvoiceType,
    company.CompanyId,
    company.CompanyName,
} into g
select new
{
   g.Key.CompanyId,
   g.Key.CompanyName,
   g.Key.InvoiceNo,
   g.Key.InvoiceType,
   g.Key.InvoiceId,
   Sum = g.Sum(o => o.invoice.Quantity * o.company.Rate)
};