2010-04-16 45 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

我想你的意思是「我需要查詢這個列表覆蓋範圍內的所有項目」而不是「範圍內」,因爲你想要範圍開始前的最後一個值和範圍內開始的任何值,對嗎? – 2010-04-16 23:27:53

回答

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可以處理它。

這不是很漂亮,我不會推薦在兩階段方法中使用它。

+0

謝謝,C#LINQ缺少一個操作符得到答案,告訴我爲什麼我不能以我想要的方式寫這個。 F#是一個有趣的想法。 – itchi 2010-04-17 18:43:22

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值 - 一個起始值。 – 2010-04-16 23:29:09

+0

是的,我實際上是這樣寫的,然後將它轉換爲lambda語法。但是,這兩個關於上下文的呼籲困擾着我。 – itchi 2010-04-16 23:56:01

+0

@Hightechrider謝謝,更新了帖子。 @itchi擴展方法肯定是可行的,但LINQ查詢可以更可讀恕我直言,再加上讓子查詢,而不是一個單獨的查詢。 – 2010-04-17 18:12:36