1

私のデータベースには、次のようなエントリを持つ販売テーブルがあります。

_____________________________________
| id |  title_id   |       qty      |
-------------------------------------
| 0  |  6          |        10      |
-------------------------------------
| 1  | 5           |        5       |
-------------------------------------
| 2  |  6          |        2       |
-------------------------------------

Title_idは、次のようなTitlesテーブルを指す外部キーです。

_____________________________________
| id |  title_id   |       title    |
-------------------------------------
| 0  |  5          |       Soda     |
-------------------------------------
| 1  |  6          |      Coffee    |
-------------------------------------

販売された上位5つの製品を見つけたいのですが、これは、販売テーブルに入力されたすべての製品の数量値を計算してから、結果を数量順に降順に並べ、選択を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);
4

5 に答える 5

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();

topsTitle次に、オブジェクトと数量の合計の2つのプロパティを持つ匿名タイプのリストです。


次に、次のような値を取得できます。

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();
于 2013-01-13T17:15:55.173 に答える
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);
于 2013-01-13T17:21:42.570 に答える
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();

sales.title_id-> title.idの間に外部キーがあり、LINQ to SQLを使用していると仮定して、joinステートメントを省略していることに注意してください。また、連鎖メソッド構文を優先してクエリ構文の使用を避けたことにも注意してください。このユースケースでは非常に明確だと思います(ただし、常に正しいとは限りません。つまり、クロス結合)。

また、SQLとLINQにはいくつかの類似点がありますが、句/メソッドの名前に惑わされないでください。LINQはSQLではありません。IMHO、Microsoftは、似たような外観にすることで人々を快適にしようとしました;)

編集:修正されたGroupBy()

于 2013-01-13T17:39:34.463 に答える
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);
于 2013-01-13T17:53:32.203 に答える
0

GroupByを確認する必要があります。これはあなたが必要なものを与えるでしょう

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

于 2013-01-13T17:13:14.113 に答える