嵌套的Linq Queries Saga

时间:2010-01-13 21:55:27

标签: sql linq

所以我试着写这样的东西:

SELECT  s.CompanyID, 
        s.ShareDate, 
        s.OutstandingShares, 
        s.ControlBlock 
FROM (
    SELECT MAX(ShareDate) AS Sharedate, 
           CompanyID
    FROM ShareInfo
    WHERE (ShareDate <= @filter_date)
    GROUP BY CompanyID
 ) AS si 
 INNER JOIN
 tblShareInfo AS s ON s.ShareDate = si.Sharedate AND s.CompanyID = si.CompanyID

本质上,这是尝试返回最新的共享信息,我们保持运行历史记录。现在我想在LINQ中编写类似的东西。

这是我最接近的尝试:

From a _
In db_context.ShareInfos _
Where a.ShareDate <= filter_date _
Group a By a.CompanyID Into Group _
Select CompanyID, MostRecentShareDate = Group.Max(Function(a) a.ShareDate) _
Join b In db_context.ShareInfos On b.CompanyID Equals a.CompanyID _
Select b.CompanyID, b.ShareDate, b.OS, b.CB()

不幸的是,这不会编译。显然我不是以某种方式理解LINQ语法。任何人都可以引导我朝着正确的方向前进吗?

感谢。

2 个答案:

答案 0 :(得分:0)

使用最后一个选择语句,您应该使用

select new {

CompanyID = b.CompanyID,
ShareDate = b.ShareDate,
OS = b.OS,
CB = b.CB
};

这是一个开始...

答案 1 :(得分:0)

好的,所以看起来需要使用两个语句来完成:

Dim MostRecentShareDates = _ 
From s2 In query_collection.DBContext.ShareInfos _
Where s2.ShareDate <= filter_date _
Group s2 By s2.CompanyID Into Group _
Select New With { _
                    .CompanyID = CompanyID, _
                    .MostRecentShareDate = Group.Max(Function(s3) s3.ShareDate) _
                }

Return From s In query_collection.DBContext.ShareInfos _
       Join s1 In MostRecentShareDates On s.CompanyID Equals s1.CompanyID And s.ShareDate Equals s1.MostRecentShareDate _
       Select New With { _
                        .CompanyID = s.CompanyID, _
                        .ShareDate = s.ShareDate, _
                        .OS = s.OS, _
                        .CB = s.CB _
                       }

我尝试使用'Let'关键字将第一个语句嵌入到第二个语句中,但这也不会编译。现在关于这一点的好处是Linq延迟了执行,所以在遍历第二个语句返回的集合之前,不会生成任何SQL。 Linq非常聪明,可以将两个代码片段组合成一个SQL语句,基本上与我在上面原始SQL中编写的语句完全相同。