请查询LINQ查询帮助。选择每个FK的最新记录

时间:2011-03-03 19:48:55

标签: sql linq

假设我有一张如下表:

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就不那么好。

非常感谢你的帮助。

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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:)

答案 2 :(得分:1)

根据您的评论,您希望在指定日期选中复选框

var results = db.CheckBoxHistory.Where(cbh => cbh.Selected == 1 && cbh.DateCreated.Date == DateSpecified)
如果您想通过CheckboxId将其限制为最新结果,

会为您提供这些结果

.GroupBy(cbh => cbh.CheckboxId)

你可以循环结果并获取每个复选框的最新信息,如此

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