我想将以下查询转换为 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 的工作原理,尤其是在分组、聚合数据、扩展、子查询等方面。这很有趣,但它开始变得令人沮丧,因为我很难找到有关如何执行此操作的详细解释。