我有两个实体,假设它们被称为容器和记录。他们有一个主孩子关系:一个'容器'可以容纳许多记录。
数据库中的Records表包含以下列:
Record实体没有任何反向引用Container的导航属性。
我正在为我的存储库编写LINQ查询,该查询将仅检索每个RecordType_Id具有最新日期的容器的记录。应忽略所有旧记录。
因此,如果一个容器有5条记录,每条RecordType_Id一条,日期为2011年5月24日。但是每个RecordType_Id还有另外5条记录,但日期为20 / May / 2011。然后只检索带有24 / May日期的前5个并将其添加到容器中的集合中。
我提出了一个SQL查询来完成我需要的工作(但也许有一些更有效的方法?):
select t.*
from Records t
inner join (
select Container_Id, RecordType_Id, max(Date) AS MaxDate
from Records
group by Container_Id, RecordType_Id ) g
on t.Date = g.MaxDate
and t.Container_Id = g.Container_Id
and t.RecordType_Id = g.RecordType_Id
order by t.Container_Id
, t.RecordType_Id
, t.Date
然而,我正在努力将其转换为适当的LINQ查询。 EF已经生成一个相当大的查询,只是为了加载实体,这使我不确定这个SQL查询有多少实际上与LINQ查询相关。
答案 0 :(得分:1)
脱离我的头顶:
var q = from c in Container
from r in c.Records
group r by r.RecordType.RecordType_Id into g
select new
{
Container = c,
RecordType_Id = g.Key,
Records = from gr in g
let maxDate = g.Max(d => d.Date)
where gr.Date == maxDate
select gr
};
答案 1 :(得分:1)
尝试使用LinqPad,它可以帮助您轻松测试linq查询。甚至针对现有的EF模型(在您的项目中)。访问http://www.linqpad.net/