gpt4 book ai didi

c# - LINQ 到 SQL : Complicated query with aggregate data for a report from multiple tables for an ordering system

转载 作者:太空狗 更新时间:2023-10-29 18:33:43 25 4
gpt4 key购买 nike

我想将以下查询转换为 LINQ 语法。我在设法让它工作时遇到了很多麻烦。我实际上尝试从 LINQ 开始,但发现如果我以相反的方式编写它可能会更好。

SELECT
pmt.guid,
pmt.sku,
pmt.name,
opt.color,
opt.size,
SUM(opt.qty) AS qtySold,
SUM(opt.qty * opt.itemprice) AS totalSales,
COUNT(omt.guid) AS betweenOrders
FROM
products_mainTable pmt
LEFT OUTER JOIN
orders_productsTable opt ON opt.products_mainTableGUID = pmt.guid
LEFT OUTER JOIN orders_mainTable omt ON omt.guid = opt.orders_mainTableGUID AND
(omt.flags & 1) = 1
GROUP BY
pmt.sku, opt.color, opt.size, pmt.guid, pmt.name
ORDER BY
pmt.sku

最终结果是一个表格,上面显示了有关产品的信息。如何使用理解语法以 LINQ 形式编写此查询?

此外,我可能想添加额外的过滤器(例如,添加到 orders_mainTable)。

这是我尝试完成的一个示例,非常接近但我不确定它是否是“正确”的方式,并且无法根据 orders_productsTable 中的尺寸和颜色对其进行分组。

from pmt in products_mainTable
let Purchases =
from opt in pmt.orders_productsTable
where ((opt.orders_mainTable.flags & 1) == 1)
where ((opt.orders_mainTable.date_completedon > Convert.ToDateTime("01/01/2009 00:00:00")))
select opt
orderby pmt.sku
select new {
pmt.guid,
pmt.sku,
pmt.name,
pmt.price,
AvgPerOrder = Purchases.Average(p => p.qty).GetValueOrDefault(0),
QtySold = Purchases.Sum(p => p.qty).GetValueOrDefault(),
SoldFor = Purchases.Sum(p => p.itemprice * p.qty).GetValueOrDefault()
}

*编辑:

为了更明确一点,以便您可以理解我正在尝试做的事情,这里有一些更多的解释。

产品存储在products_mainTable中订单存储在 orders_mainTable 中已订购的产品存储在 orders_productsTable

我想根据产品、订单等创建多个报告,深入研究数据并找到有意义的位以显示给最终用户。

在这种情况下,我试图显示哪些产品在一段时间内被购买过,并且最受欢迎。卖出了多少,价格是多少,每个订单的突破是多少。也许不是最好的顺序,但我只是在试验并选择了这个。

所有表都与其他表有关系。因此,从产品表中,我可以获得订购该产品的订单等。

我遇到的最大问题是了解 LINQ 的工作原理,尤其是分组、聚合数据、扩展、子查询等。这很有趣,但开始变得令人沮丧,因为我很难找到有关如何这样做。

最佳答案

我也是 LINQ 的初学者。我不知道这是否是按多个字段分组的正确方法,但我认为您必须将这些分组字段转换为表示键。因此,假设您所有的分组字段都是字符串或整数,您可以按如下方式创建键:

        var qry = from pmt in products_mainTable
join opt in orders_productsTable on pmt.guid equals opt.products_mainTableGUID
join omt in orders_mainTable on opt.orders_mainTableGUID equals omt.guid
where (opt.orders_mainTable.flags & 1) == 1
group omt by pmt.sku + opt.price + opt.size + pmt.guid + pmt.name into g
orderby g.sku
select new
{
g.FirstOrDefault().guid,
g.FirstOrDefault().sku,
g.FirstOrDefault().name,
g.FirstOrDefault().color,
g.FirstOrDefault().price,
AvgPerOrder = g.Average(p => p.qty).GetValueOrDefault(0),
QtySold = g.Sum(p => p.qty).GetValueOrDefault(),
SoldFor = g.Sum(p => p.itemprice * p.qty).GetValueOrDefault()
};

我没有对此进行测试,所以请看看这是否对您有任何帮助。

关于c# - LINQ 到 SQL : Complicated query with aggregate data for a report from multiple tables for an ordering system,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com