假设我有一张如下表:
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就不那么好。
非常感谢你的帮助。
答案 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
}