我希望下面的查询转换为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)
答案 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)
};