所以我试着写这样的东西:
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语法。任何人都可以引导我朝着正确的方向前进吗?
感谢。
答案 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中编写的语句完全相同。