2014-10-16 68 views
1

我有一個表,看起來像這樣:的LINQ到SQL過濾的最後一個元素的日期

FruitID | BasketID | HarvestDate 
    10 | 435 | 10/1/2014 
    11 | 430 | 8/4/2014 
    12 | 435 | 3/1/2014 
    13 | 430 | 5/2/2014 

我想在BasketIDs的列表,以傳遞和返回只有BasketID,所有的HarvestDate少比某個日期。例如,如果我傳遞430和435以及9月29日的數據,那麼查詢應該只返回430,因爲435的Fruit 10的HarvestDate超過了參數。

這是我有:

var Output = (from f in MyDC.Fruits 
       where TheBasketIDs.Contains(f.BasketID) && 
       f.HarvestDate <= TheDate 
       select f.BasketID).ToList(); 

我的直覺告訴我,我應該按匹配的,然後排序HarvestDate通過ID和採取BasketIDs其中最後日期是小於日期參數BasketIDs但我堅持語法。我該如何解決這個問題?

謝謝。

+0

什麼讓你覺得你需要「修復」查詢?你有沒有試過你已經有的查詢? – 2014-10-16 14:57:18

+0

是的,這是我的查詢,問題是當我通過日期9/29時,它將同時返回430和435。它不應該返回435,因爲那個籃子的收穫日期也是10/1。該查詢的工作原理是它不會出錯,但不會返回預期值。 – frenchie 2014-10-16 15:01:18

回答

4
(from f in MyDc.Fruits 
group f by f.BasketID into g 
where TheBasketIDs.Contains(g.Key) 
&& g.OrderByDescending(gg=>gg.HarvestDate).First().HarvestDate <= TheDate 
select g.First().BasketID).ToList(); 
+0

查詢應以.ToList()結尾,因爲我們正在返回一個BasketID列表。我仍在使用groupby和where子句來處理它。我嘗試使用select g.Select(x => x.BasketID).ToList();但它不工作(還) – frenchie 2014-10-16 15:16:09

+0

@frenchie,請參閱編輯。 – 2014-10-16 15:19:08

+0

好了,看到了編輯:刪除了select中的排序過濾器,並編譯:選擇g.First()。LeadID,然後用(.....).ToList()包裝整個查詢編輯。我們幾分鐘就會知道。 – frenchie 2014-10-16 15:21:04

2

正好相反。

選擇所有那些收穫日大於HarvestDate並且使您的查詢和那些在第一個查詢中返回的應該被刪除。

var Output1 = (from f in MyDC.Fruits 
       where TheBasketIDs.Contains(f.BasketID) && 
       f.HarvestDate > TheDate 
       select f.BasketID).ToList(); 

var Output2 = (from f in MyDC.Fruits 
      where TheBasketIDs.Contains(f.BasketID) && 
      f.HarvestDate <= TheDate 
      select f.BasketID).ToList(); 

var Output = Output2.Except(Output1).ToList(); 
+0

+1。我喜歡你想的方式:) – Reniuz 2014-10-16 15:11:17

+0

我在這裏臉紅...... tnx :) – ilans 2014-10-16 15:13:01

+0

難道你不需要提供一些定製的比較器嗎? – 2014-10-16 15:14:25