我的数据库有一个销售表,其条目如下:
_____________________________________
| id | title_id | qty |
-------------------------------------
| 0 | 6 | 10 |
-------------------------------------
| 1 | 5 | 5 |
-------------------------------------
| 2 | 6 | 2 |
-------------------------------------
Title_id是指向标题表的外键,如下所示:
_____________________________________
| id | title_id | title |
-------------------------------------
| 0 | 5 | Soda |
-------------------------------------
| 1 | 6 | Coffee |
-------------------------------------
我想找到销售前五名的产品,这意味着我需要为销售表中的所有产品计算每个产品的数量值,然后按降序排序结果,并将选择限制为5.
但是我是C#ASP.NET的新手,对SQL来说有些新手。我不知道怎么用LINQ做这个。 到目前为止,这是我的代码:
var getIds = (from sale in db.sales
join tit in db.titles on sale.title_id equals tit.title_id
group sale by sale.qty into result
orderby result.Sum(i => i.qty) descending
select new Publication
{
PubID = sales.title_id, Title = tit.title
}
).Take(5);
答案 0 :(得分:3)
假设你有一个导航属性Sale.Title
,这样的事情应该这样做:
var tops =
db.Sales
.GroupBy( o => o.Title )
.Select( o => new { Title = o.Key, Sum = o.Sum( x => x.Quantity ) } )
.OrderByDescending( o => o.Sum )
.Take( 5 )
.ToList();
tops
是一个包含两个属性的匿名类型列表:Title
对象和数量之和。
然后您可以获得如下值:
foreach( var top in tops )
{
int titleId = top.Title.title_id;
string title = top.Title.title;
int sumOfQuantities = top.Sum;
...
如果您只想要顶级Title
个对象,可以像这样选择它们:
List<Title> topTitles = tops.Select( o => o.Title ).ToList();
答案 1 :(得分:1)
var result= (from p in sales
let k = new
{
Name = p.Name
}
group p by k into t
orderby Name descending
select new
{
Name = t.Name,
Qty = t.Sum(p => p.Qty)
}).Take(5);
答案 2 :(得分:1)
如果Sales表中的条目每个项目多于一个(例如:在您的示例中,您有'Soda'10 +'Soda'2,那么您需要GroupBy()
,使用名称作为键(或者它是相关的id,如果它在另一个表中),但不是数量。
var topSales = db.sales.GroupBy(x => x.title)
.Select(g => new
{
Title = g.Key,
Qty = g.Sum(x => x.qty)
})
.OrderByDescending(x => x.Qty)
.Select(x => new Publication
{
PubID = x.Title.title_id,
Title = x.Title.title1
})
.Take(5)
.ToList();
请注意,我已经省略了join语句,假设您在sales.title_id - &gt;之间有一个外键。 title.id,你正在使用LINQ to SQL。另请注意,我已经避免使用查询语法来支持链式方法语法,我认为在这个用例中很清楚(虽然并非总是如此,即:交叉连接)。
此外,SQL和LINQ有一些相似之处,但不要让条款/方法的名称欺骗你,LINQ不是SQL,恕我直言,微软只是试图通过使它看起来相似来让人感到舒服;)
编辑:修复了GroupBy()
答案 3 :(得分:1)
var result= (from p in sales
let k = new
{
Name = p.Name
}
group p by k into t
select new
{
Name = t.Name,
Qty = t.Sum(p => p.Qty)
}).OrderByDescending(i => i.Qty).Take(5);
答案 4 :(得分:0)
你需要看看GroupBy;这将为您提供所需的信息