2010-04-16 3 views
2

C# 3.5 및 EntityFramework를 사용하고 있습니다. 금리가 포함 된 데이터베이스 항목 목록이 있습니다. 불행히도이 목록에는 유효 시작 날짜 만 포함되어 있습니다. 범위 내의 모든 항목에 대해이 목록을 쿼리해야합니다.LINQ - 시작 날짜 만있는 유효한 날짜 범위를 쿼리하는 방법

그러나 데이터베이스를 두 번 쿼리하지 않고도이 작업을 수행 할 수있는 방법이 없습니다. (EntityFramework를 사용한 지연된 실행이 단 한 번의 호출 만하고 있는지 궁금해하고 있습니다.) 관계없이 컨텍스트를 두 번 사용하지 않고이 작업을 수행 할 수 있는지 궁금합니다.

internal IQueryable<Interest> GetInterests(DateTime startDate, DateTime endDate) { 
    var FirstDate = Context.All().Where(x => x.START_DATE < startDate).Max(x => x.START_DATE); 
    IQueryable<Interest> listOfItems = Context.All().Where(x => x.START_DATE >= FirstDate && x.START_DATE <= endDate); 
    return listOfItems; 
} 
+0

범위가 시작되기 전에 마지막 값과 범위 내에서 시작되는 값을 원하기 때문에 "범위를 벗어나는 모든 항목에 대해이 목록을 쿼리해야합니다"라고 생각하십니까? –

답변

1

내가 EF에이 시도하지 않은하지만 Linq에의 개체에 잘 작동 :

var result = source 
    .OrderBy(x => x.start) 
    .GroupBy(x => x.start < startDate) 
    .SelectMany((x, i) => i == 0 ? new[] {new { value = x.Last().value, start = x.Last().start }} : x.Where(y => y.start < endDate)); 

문제는 C#을 LINQ 당신이 순서에 이전 항목에 액세스 할 수 있습니다 연산자를 빠져 있다는 점이다. F #이 분명히 이것을 처리 할 수 ​​있습니다. 해결 방법에는 GroupBy 또는 Aggregate 작업이 포함되었습니다. 이 경우 GroupBy에서 처리 할 수 ​​있습니다.

꽤 아니지만 2 단계 접근 방식을 사용하지 않는 것이 좋습니다.

+0

감사합니다. C# LINQ 연산자가 누락 된 이유는 내가 원하는 방식으로이 글을 쓸 수없는 이유를 보여 주려는 응답을 얻습니다. F #은 흥미로운 생각입니다. – itchi

2

당신이 LINQ 쿼리를 사용할 수 있다면, 당신은이 작업을 수행 할 수 있습니다 : 당신이 교대로 수행해야 할 수 있도록 최대가, 이런 식으로 작동하는지

(from c in dbContext.Table 
let firstdate = dbContext.Table.Max(i => c.StartDate < startDate) 
where c.StartDate >= firstdate 
and c.StartDate <= enddate 
select c) 

잘 모르겠어요 :

(from c in dbContext.Table 
let firstdate = dbContext.Table.Select(i => i.StartDate).Max(i => c.StartDate < i) 
where c.StartDate >= firstdate 
and c.StartDate <= enddate 
select c) 

이런 식으로.

+0

c.EndDate - itchi에는 레코드 당 하나의 DateTime 값 (시작 값) 만 있습니다. –

+0

예, 실제로 원래 이렇게 작성한 다음 람다 구문으로 변환했습니다. 그러나 상황에 대한 두 번의 부름은 나를 괴롭혔다. – itchi

+0

@Hightechrider 감사합니다. 게시물을 업데이트했습니다. @itchi 확장 메서드는 확실히 할 수 있지만, LINQ 쿼리는 IMHO를 더 읽기 쉽고, 별도의 쿼리 대신 서브 쿼리를 수행 할 수 있습니다. –

관련 문제