2012-04-05 89 views
8

私は、データ構造に各項目についてはLINQの最新のレコードを選択する

enter image description here

を持っている各通貨である特定の日に、それの価格のレコードがあります。私は各通貨の最新の価格を返すクエリを作成する必要があります。

このクエリは機能しますが、通貨ID 1には複数のAmountsが返されます。この商品のすべての通貨で最新の価格を示す3つのレコード7,8 and 9のみを返す必要があります。

var q = (from c in db.tblStoreItemPrices where c.ItemID == ID select new { c.CurrencyID, c.Amount }); 

すべての注文を無視して、レコードがランダムに注文されたものとします。

ありがとうございました!

+0

から必要な電子情報は が、それだけでは、パフォーマンスのために、このrandom'nessを減少させるために、主キー以外のクラスタ化インデックスを持っているより多くの意味がありません「のレコードがランダムに順序付けられていることを前提とし」。 – KingCronus

答えて

27

これは動作するはずです:

db.tblStoreItemPrices 
    .Where(c => c.ItemID == ID) 
    .GroupBy(c => c.CurrencyID) 
    .Select(g => g.OrderByDescending(c => c.Date).First()) 
    .Select(c => new { c.CurrencyID, c.Amount }); 

説明:特定のアイテムID

  • グループの

    1. 選択行CurrencyID
    2. によって
    3. 各通貨グループ内からほとんどを持っている行を選択最近の日付(結果セット内の各通貨IDに対して1行を残す)
    4. これらの行
  • +1

    ありがとう - これは大きな助けとなりました。 ASP.NET MVC 5ではFirst - FirstOrDefaultに変更しただけで問題なく動作していました。もう一度ありがとう:) – Tunerx

    +0

    ではなく、日付に基づいてorderByDescending、IDにorderByDescendingを実行します。idはおそらくインデックスに登録され、最新のデータに関連付けられているため、クエリは高速になります。 –

    +0

    しかし、列の日付を入力すると既にインデックスされています –

    関連する問題