2011-03-03 77 views
0

比方說,我有一個表,看起來像這樣:請LINQ查詢幫助。選擇最近的記錄每個FK

Id  CheckboxId  Selected  DateCreated 
1  1    1   1/1/2010 
2  2    1   1/2/2010 
3  1    0   1/3/2010 
4  3    1   1/4/2010 
5  3    0   1/5/2010 

CheckboxId是一個FK和表只是當複選框被選中或取消選中的歷史。

我想得到的是每個CheckboxId的最新記錄。在我的演示表的情況下,我想要2,3和5行。你會怎麼做到這一點?此外,我確信這在查詢開始時與「where」一樣容易,但是如果它也可以被修改爲僅在特定日期之前獲得記錄,那將是非常棒的。

我很難弄清楚如何編寫查詢來在SQL中執行此操作,並且它使得無法進行鏈接查詢。我相信它必須是從不同checkboxIds的子查詢中選擇出來的,但是我的SQL並不是那麼好。

非常感謝您的幫助。

回答

5

應該是這樣的:

var results = (from x in context 
     group x by x.CheckboxID into g 
     select new 
     { 
      CheckboxID = g.Key, 
      MaxItem = g.OrderByDescending(o => o.DateCreated).FirstOrDefault() 
     }); 

然後,你可以這樣做:

foreach (var x in results) 
    x.MaxItem.Selected //...etc. 
+0

有趣。我明天會玩,看看我能做些什麼。 – William 2011-03-03 23:19:02

+0

這基本上是我最終做的。我在另一個LINQ語法中寫了它,因爲我更喜歡它。所以我最後的查詢結果是:var myItems = context.Source.Where(x => x.DateCreated x.CheckboxId).Select(grp => grp.OrderByDescending(x => x .DateCreated).FirstOrDefault())這也返回我的「源」項目,而不是匿名數據類型,這對我來說似乎更好,因爲我可以想到沒有什麼好的理由。 – William 2011-03-04 22:16:50

+0

也可以。 – 2011-03-07 01:10:14

1

使用子查詢,以獲得最新的條目每CheckBoxId,然後再加入到該表中獲取結果的其餘部分:

;with CheckBoxRecent as (
    select 
     CheckBoxId 
     ,max(DateCreated) as MostRecentDate 
    from 
     CheckBoxData T 
    where 
     T.DateCreated < @SpecifiedDate 
    group by 
     CheckBoxId 
) 
select 
    T1.* 
from 
    CheckBoxData T1 
inner join 
    CheckBoxRecent T2 on T1.CheckBoxId = T2.CheckBoxId 
     and T1.DateCreated = T2.MostRecentDate 
order by 
    CheckBoxId 

我把它作爲一個練習的讀者轉換爲LINQ: )

+0

Thi這很好,但不是我所需要的。我需要實際的行,特別是我需要選擇列。我試圖回顧指定日期的歷史記錄,並查看哪個checkboxeId的Selected = 1。 – William 2011-03-03 20:03:12

+0

丹丹!好吧,我還沒有設置我的表,但我相信現在這個查詢是我在SQL中需要的。現在要弄清楚在LINQ中如何做到這一點。 – William 2011-03-03 20:41:42

+0

@William - 請看我的第一個答案,它應該讓你非常接近你的需要。 – 2011-03-03 21:43:45

1

根據您的評論你想在指定的日期選擇複選框

var results = db.CheckBoxHistory.Where(cbh => cbh.Selected == 1 && cbh.DateCreated.Date == DateSpecified) 

將讓你的結果,如果要限制它的最新的CheckboxId只需添加這

.GroupBy(cbh => cbh.CheckboxId) 

你可以循環的結果,並抓住最新的每個checkboxid像這樣

foreach(var result in results) { 
    var latest = result.OrderByDescending(cbh => cbh.DateCreated).FirstOrDefault(); 
    //latest has all fields in the checkboxhistory table 
} 
+0

我不認爲你完全理解我的需要。我需要每個複選框ID的最近歷史記錄。它不能簡單地是最近的選擇= 1,因爲這會給我不準確的數據。例如,看看我的表格爲2010年5月1日。我需要爲複選框3獲取記錄5,而不是爲複選框3記錄4。使用你的第一個查詢,我會錯誤地看到複選框3在2010年1月5日被選中。理解?你的第三個代碼塊將完成這項工作,但我希望有一種不太暴力的方法來完成它,即純粹的LINQ方式。 – William 2011-03-03 20:38:51

+0

然後,只需通過checkboxid刪除where子句和組,然後您可以爲每個checkboxid命令集合,然後查看每個條目 – Jimmy 2011-03-03 21:00:42