2012-04-05 2 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 }); 

설명 : 각 통화 그룹 내에서 CurrencyID

  • 하여 특정 항목 ID
  • 그룹

    1. 행을 선택 가장이있는 행을 선택 최근 날짜 (결과 집합에 각 통화 ID별로 하나의 행을 남겨 둡니다)
    2. 이러한 행
  • +1

    고마워요. 큰 도움이되었습니다. ASP.NET MVC 5에서는 First - FirstOrDefault로 변경된 후 처음에는 문제가 없었습니다. 다시 한 번 감사드립니다 :) – Tunerx

    +0

    보다는 오히려 날짜에 따라 orderByDescending, id는 id가 가장 색인화되어 최신 데이터와 연관되어 있으므로 orderByDescending을 사용하면 쿼리가 빠를 것입니다. –

    +0

    하지만 열 날짜를 incase하면 이미 괜찮습니다. –

    관련 문제