2013-07-03 2 views
0

db의 테이블 구조를 변경할 수없는 곳에서 업데이트해야하는 응용 프로그램을 상속했습니다.Linq에서 Entity Framework로 필터링

ID | PromoID | VersionDate | Type 
1 P0001  01/03/2013 Live 
2 P0002  02/03/2013 Live 
3 P0001  02/04/2012 Draft 
4 P0003  01/03/2013 Live 
5 P0003  01/02/2013 Live 

원본 개발자는 원시 레코드를 버전 관리하는 기본 개념을 사용했습니다. 내가해야 할 일은 모든 "라이브"버전의 최신 버전을 반환하는 linq 쿼리를 만드는 것입니다. 그러나 해당 버전 중 하나라도 "초안"유형을 가지고 있으면 레코드가 반환되지 않도록해야합니다.

I 이 있습니다

var records = from r in _context.Promotions 
       let maxversion = 
          (from v in _context.Promotions 
           where v.PromoID == t.PromoID 
           select v.VersionDate).Max() 
       where r.Type == "Live" 
       && r.VersionDate == maxversion 
       select r 

하지만 난 그들 중 하나가 "초안"를 입력이 동일한 PromoID가 모든 레코드를 필터링하는 방법을 모른다. 필자가 제공 한 데이터에서 동일한 PromoId를 공유하고 # 3이 초안 유형을 가지고 있으므로 레코드 # 1과 # 3을 모두 잘라야합니다.

답변

0

이런 식으로 뭔가 작업을해야합니다 :

var records = from r in _context.Promotions 
       let maxversion = 
          (from v in _context.Promotions 
           where v.PromoID == t.PromoID 
           select v.VersionDate).Max() 
       where r.Type == "Live" 
       && r.VersionDate == maxversion 
       && !_context.Promotions.Any(p => p.PromoID = t.PromoID && p.Type=="Draft") 
       select r 
2

이것은 또한, IEnumerable을 결과 (평가 때) 여전히 데이터베이스에 대한 단일 쿼리를 생성해야합니까한다

var ids_with_drafts = from p1 in _context.Promotions 
         where p1.Type == "Draft" 
         select p1.PromotionID; 

var result = from promotion in _context.Promotions 
      where !ids_with_drafts.Contains(promotion.PromotionID) 
      group promotion by promotion.PromotionID 
      into grp 
      select grp.OrderByDescending(x => x.VersionDate).First(); 
관련 문제