【问题标题】:How to join two tables and make group by in Linq如何在 Linq 中加入两个表并进行分组
【发布时间】:2013-01-02 22:30:58
【问题描述】:

我对 Linq 选择语句有疑问。我是 Linq 的新手,所以任何帮助都会非常有帮助。我做了很多研究,但还是没能写下正确的 Linq 语句。

我有这两个表和属性:

Table Titles(title_id(PK), title) and
Table Sales(title_id(PK), qty)

title_id 和标题字符串值在哪里,qty 是一个数字,代表一些数量。

我需要编写一个选择,从这两个表中选出五个最畅销的标题。
所以,我需要从数量求和(我们可以有更多具有相同Sales.title_id属性的记录)并按title_id分组并按sum(qty)降序排序,然后返回属性标题和title_id

我怎样才能为我的问题找到合适的解决方案?

问候, 达哈卡

【问题讨论】:

  • 您使用的是实体框架之类的东西吗?还是 Linq 到 Sql?
  • 是的,我编写了 ASP .Net 服务和应用程序代码,并使用 Linq 在表中搜索数据。这就是为什么我需要得到这个查询。

标签: linq


【解决方案1】:

您可以通过title_id 对表格进行组连接(每个组g 将代表所有已连接标题的销售额)。然后选择该标题的标题描述和总销售额。按总计排序结果,选择标题并获取所需数量的畅销标题:

var query = (from t in db.Titles
             join s in db.Sales on t.title_id equals s.title_id into g
             select new { Title = t.title, Total = g.Sum(x => x.qty) } into ts
             orderby ts.Total descending
             select ts.Title).Take(5);

生成的 SQL 将如下所示:

SELECT TOP (5) [t2].[title] AS [Title], [t2].[value] AS [Total]
FROM (
    SELECT [t0].[title_id], (
        SELECT SUM([t1].[qty])
        FROM [Sales] AS [t1]
        WHERE [t0].[title_id] = [t1].[title_id]
        ) AS [value]
    FROM [Titles] AS [t0]
    ) AS [t2]
ORDER BY [t2].[value] DESC

【讨论】:

  • 您好,感谢您的回答。这几乎是我需要的,谢谢!你为我节省了很多时间。我真的很感激你的帮助!
【解决方案2】:

以下是方法语法中的 linq 查询

    sales.GroupBy(s=>s.title_id)
    .Select ( x =>  
       new {
           Title_id = x.Key, 
            Sales= x.Sum (x=> x.qty)
        })
    .OrderByDescending(x=>x.Sales).Take(5)
        .Join( titles, 
            sale=>sale.Title_id,
            title=> title.title_id, 
            (sale, title)=> new 
                {
                  Title = title.Title, 
                  TotalSales=sale.Sales
                }
            );

【讨论】:

  • 感谢您的回答。通过这两个示例,我确实进一步了解了 Linq。再次感谢!
猜你喜欢
  • 2020-02-15
  • 2021-07-23
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2012-05-28
  • 2015-03-03
  • 2018-04-21
  • 1970-01-01
相关资源
最近更新 更多