2010-01-13 253 views
0

所以我想寫的東西是這樣的:嵌套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語法。任何人都可以引導我走向正確的方向嗎?

謝謝。

回答

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 _ 
         } 

我嘗試使用「讓」關鍵字將第一條語句嵌入到第二條語句中,但這不會進行編譯。現在關於這一點的好處是Linq延遲了執行,所以在遍歷第二條語句返回的集合之前,不會生成SQL。然後Linq足夠聰明,可以將兩個代碼片段組合成一個SQL語句,基本上與我在上面我的原始SQL中所寫的語句完全相同。

0

與你最後選擇語句,你應該使用

select new { 

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

這是一個開始......

+0

這是C#的語法,順便說一句... – 2010-01-13 22:23:13

+0

我想我應該提到的是,不編譯的部分是加入它的行。該行最後的'a.CompanyID'給出錯誤「名稱」a'未被聲明或不在當前範圍內「 – Bitfiddler 2010-01-13 23:05:06