如何使用LINQ2SQL将一个表中的每一行与另一个表中最新日期的行连接起来
假设我有一个名为[Items]的表,它有一个主键如何使用LINQ2SQL将一个表中的每一行与另一个表中最新日期的行连接起来,sql,linq,linq-to-sql,Sql,Linq,Linq To Sql,假设我有一个名为[Items]的表,它有一个主键ItemID,还有一个名为[ItemStatuses]的表,它与ItemID链接,有一个自动递增的ID和一个日期(以及其他用于捕获各种内容的列) 这意味着,对于每个项目,我都会有许多项目状态 项目: ItemID 1 2 ID ItemID Date ---------------------------- 1 1 1/1/2010... 2 1 1/2/2010... 3
ItemID
,还有一个名为[ItemStatuses]的表,它与ItemID
链接,有一个自动递增的ID和一个日期(以及其他用于捕获各种内容的列)
这意味着,对于每个项目,我都会有许多项目状态
项目:
ItemID
1
2
ID ItemID Date
----------------------------
1 1 1/1/2010...
2 1 1/2/2010...
3 1 1/3/2010...
4 2 1/1/2010...
5 2 1/2/2010...
ItemID Date
-----------------------
1 1/3/2010...
2 1/2/2010...
项目状态:
ItemID
1
2
ID ItemID Date
----------------------------
1 1 1/1/2010...
2 1 1/2/2010...
3 1 1/3/2010...
4 2 1/1/2010...
5 2 1/2/2010...
ItemID Date
-----------------------
1 1/3/2010...
2 1/2/2010...
我希望能够使用最新的ItemStatus
加入每个项目。我有一个解决方案,它将信息抓取到实体对象中,然后进行工作,但这需要很多时间。如果我可以使用LINQ2SQL查询这个,它会快得多。我已经阅读了关于stackoverflow的其他几个问题,但是没有一个例子对我的场景有意义。我试图弄明白这一点,但仍然无法让它发挥作用
我需要这个:
ItemID
1
2
ID ItemID Date
----------------------------
1 1 1/1/2010...
2 1 1/2/2010...
3 1 1/3/2010...
4 2 1/1/2010...
5 2 1/2/2010...
ItemID Date
-----------------------
1 1/3/2010...
2 1/2/2010...
这是一个过于简单的例子。我不想只看具体的栏目。在Items和itemstatus中有许多列需要捕获。但提到的是控制列
如果有人能帮我一把,我会非常感激的
我现在的查询不起作用,但我现在的位置是:
var results = from i in context.Items
from s in context.ItemStatuses
where s.ItemID.Equals(i.ItemID) s.Date <= inputDate
orderby s.Date descending
select new { i, s };
var results=来自context.Items中的i
来自context.itemstatus中的
其中,s.ItemID.Equals(i.ItemID)s.Date以下查询将两个表连接起来,并仅选择具有最新日期值的itemstatus
:
var results = from i in context.Items
join s in context.ItemStatuses
on
new
{
ID = i.ItemID,
maxDate = (
from ss in context.ItemStatuses
where ss.Date <= inputDate
select ss.Date
).max
}
equals new
{
ID = s.ItemID,
maxDate = s.Date
}
select new
{
i.ItemID, s.Date
};
var results=来自context.Items中的i
在context.itemstatus中加入
在…上
新的
{
ID=i.ItemID,
maxDate=(
来自context.itemstatus中的ss
其中ss.Date以下查询将两个表连接起来,并仅选择具有最新Date
值的itemstatus
:
var results = from i in context.Items
join s in context.ItemStatuses
on
new
{
ID = i.ItemID,
maxDate = (
from ss in context.ItemStatuses
where ss.Date <= inputDate
select ss.Date
).max
}
equals new
{
ID = s.ItemID,
maxDate = s.Date
}
select new
{
i.ItemID, s.Date
};
var results=来自context.Items中的i
在context.itemstatus中加入
在…上
新的
{
ID=i.ItemID,
maxDate=(
来自context.itemstatus中的ss
ss.Date感谢您的回复,我真的很感激。我正在测试答案,并将尽快标记。这是一个完美的匹配!而且它非常灵活,因此我可以在特定部分包括我需要的附加筛选,以确定最新的,并最终从我想要的项目/状态详细信息中进行选择。我需要记住考虑using匿名类型可以完成我需要完成的任务,这对我来说是一个很好的学习体验!谢谢!感谢您的回复,我真的很感激。我正在测试答案,并将尽快打分。这是一个完美的选择!而且它非常灵活,因此我可以在特定部分添加我需要的额外筛选,以确定最新的,并最终确定c选择我想要的项目/状态详细信息。我需要记住使用匿名类型来完成我需要完成的任务,这对我来说是一次很棒的学习体验!谢谢!