如何使用LINQ2SQL将一个表中的每一行与另一个表中最新日期的行连接起来

如何使用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

假设我有一个名为[Items]的表,它有一个主键
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选择我想要的项目/状态详细信息。我需要记住使用匿名类型来完成我需要完成的任务,这对我来说是一次很棒的学习体验!谢谢!