2009-08-13 4 views
1

ID (GUID)와 CreatedAt (DateTime)가 포함 된 복합 키가있는 엔터티가있는 엔터티 집합이 있습니다. 이 CreatedAt는 엔티티가 생성 된 시점입니다. 각 레코드는 여러 엔터티가 동일한 ID를 가질 수 있도록 각 엔터티의 각 버전을 나타냅니다.가장 최근의 IQueryable을 만드는 Entity Framework

요청한 엔티티의 최신 버전 만 반환하도록 IQueryable 반환 메소드를 만들고 싶습니다.하지만 대답을 찾으려고 애 쓰고 있습니다. (실제로 대답).

은 내가

(from e in context.Entities where e.ID = myID orderby e.CreatedAt).FirstOrDefault(); 

같은 쿼리를 쓸 수 있다는 것을 알고 있지만 내가 대신이 작업을 수행 할 수 있도록하려면 : 그것은 단지의 최신 버전을 반환합니다

(from e in context.GetCurrentEntities() where e.ID = myID).FirstOrDefault(); 

이러한 것을 엔티티가 필요합니다.

이 것이 가능합니까?

많은 도움에 감사드립니다.

+0

dahlbyk와 Craig Stuntz는 당신이하려는 일에 대해 정확한 답을 주셨습니다. +1 녀석들. 컴파일 된 쿼리가 성능면에서 더 잘 작동하는지 확인하고 싶습니다. 또한 IM은 문맥에 주어져서는 안되는 funcationality를 제공하는 컨텍스트 클래스에 대한 책임 때문에 RP를 추천했다. – Perpetualcoder

답변

2

당신은 ID에 의해 그룹이 같은 것을 사용하여 각 그룹에서 가장 최근 선택할 수있는 경우 : 그룹이 생성되지 않기 때문에 적어도이 아니라면

public IQueryable<Entity> GetCurrentEntities() 
{ 
    return from e in this.Entities 
      group e by e.ID into g 
      select g.OrderByDescending(e => e.CreatedAt).First(); 
} 

당신은 FirstOrDefault() 필요하지 않습니다 그룹에 하나의 Entity.

+0

고마워요. –

0

나는 작은 그림을보고 있다고 생각합니다. 저장소 패턴 구현을 고려 했습니까? LINK 그렇지 않으면 사용자의 컨텍스트 클래스에이 GetCurrentEntities 메서드를 추가해야합니다.

+0

안녕 Perpetualcoder 조언 주셔서 감사합니다. 우리는 현재 프로젝트에서 EF를 계속 사용하는 방법에 대해 많은 시간을 보냈습니다. EF가 너무 많이 들리는 것을 발견했습니다. 옵션 (다른 ORM, 손으로 코딩 된 DAL)을 살펴본 후 우리는 EF에서 '형식 안전'SQL로 사용하고 다른 모든 '기능'을 피합니다. Repostiory Pattern은 어떤 이점을 제공합니까? 제 의도는 GetCurrentEntities()를 DataContext에 추가하는 것입니다. –

+0

저장소 패턴을 사용하면 컨트롤러를 유닛 테스트 할 때 모의 저장소의 EF를 바꿀 수 있습니다. –

2

방법에 대해 :

public partial class MyEntities // or whatever you call your ObjectContext 
{ 
    public IQueryable<Entity> GetCurrentEntities() 
    { 
     return from e in context.Entities 
       group e by e.ID into g 
       from ge in g 
       orderby ge.CreatedAt desc 
       select ge.First(); 
    } 
} 

이 내 머리 위로 떨어져, 그러나 당신이 시작할 수 있어야합니다.

+0

감사합니다. 이것은 dahlbyk의 솔루션과 동일합니까? 아니면 differnt 결과입니까? –

+1

등가입니다. – dahlbyk

+0

그레이트 - 다시 한 번 감사드립니다! –