当前位置:  开发笔记 > 编程语言 > 正文

LINQ to SQL:针对订购系统的多个表的报告的汇总数据的复杂查询

如何解决《LINQtoSQL:针对订购系统的多个表的报告的汇总数据的复杂查询》经验,为你挑选了1个好方法。

我想将以下查询转换为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如何工作,尤其是分组,聚合数据,扩展,子查询等.这很有趣,但它开始变得令人沮丧,因为我很难找到关于如何做到这一点的详细解释.



1> bruno conde..:

我也是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()
                  };

我没有测试过,所以请看看这对你有什么帮助.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有