如何在Linq中加入两个表并进行分组

时间:2013-01-02 13:55:34

标签: linq

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

我有两个表和属性:

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

其中title_id和标题字符串值,qty是表示某个数量的数字。

我需要写一个选择,这将从这两个表中获得五个最畅销的标题 所以,我需要从qty中得到总和(我们可以使用相同的Sales.title_id属性创建更多记录)并按title_id进行分组,然后按sum(qty)降序排序,然后返回属性title和{ {1}}。

如何为我的问题提供合适的解决方案?

此致 Dahakka

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

以下是方法语法

中的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
                }
            );