2011-06-13 3 views
3

확인을 클릭하십시오.linq 쿼리에 최신 데이터 만 투영하십시오.

한 번에 한 항목에 대한 가격을 포함하는 표가 있습니다 (실제로는보기이지만 관련이 없습니다). 필드 :

  • 가격
  • 타임 스탬프를 ITEMNAME.

액세스 할 수있는 추가 필드가 있습니다. 칼럼과 계산 된 숫자와 같은 것들. 이것은 기본적으로 필드가있는 객체입니다. 우리는 꽤 긴 테이블 (수백만 행)을 가지고 있습니다.

나는 가장 최근의 가격으로 항목 이름 목록에 가입해야하며, 나는 linq에서 그렇게하고 싶습니다. 순수한 SQL에서는 이미 재미 있지 않습니다. 기본적으로 주어진 항목 이름에 대한 가장 최근의 개체 만 포함하는 "보기"(추가 병합을위한 IQueryable) 정의를 찾습니다. 그러면 JOIN 문을 다른 필터링 된 테이블 (가격을 표시 할 항목 목록)과 함께 사용할 수 있습니다. db 디자인은 제 3 자로 고정되어 있으므로이 문제는 재 설계로 피할 수 없습니다.

순수한 SQL에서 나는 정확한 타임 스탬프를 위해 다른 필드를 얻기 위해 ItemName과 Max (Timestamp) (ItemName by Group), 그리고 Self-Join을 동일한 테이블과 함께 포함하는 쿼리를 정의 할 것입니다.

LINQ에서이 최선의 방법을 생각해보십시오. 람다 제발, 나는 SQL 스타일 구문을 좋아하지 않아.

답변

0

Linq-to-objects에서 나는 이것을 시도합니다 :

prices 
    .GroupBy(p => p.ItemName) 
    .Select(g => new { 
         Item = g.Key, 
         LatestPrice = g.OrderByDescending(p => p.Timestamp).First() 
        }); 

을 나는 그것이 SQL에 올바르게 매핑 할 것인지 확실하지 않다지만. 너무 일을 할 것입니다

0

이 요청 :

var v = from product in Products 
    join recentProduct in 
     (from _product in Products 
     group _product by _product.Name into _products 
     select new { Name = _products.Key, TimeStamp = _products.Max(s => s.TimeStamp) }) 
    on new { product.Name, product.TimeStamp } equals new { recentProduct.Name, recentProduct.TimeStamp } 
    select product); 
+0

그래, 자기는 내가 이야기 접근을 가입 할 수 있습니다. 나는 결과 SQL을 좋아하지 않는다고 말할 수 없다; – TomTom

관련 문제