2
不知道如果僅僅通過查看示例SQL查詢來回答這個問題有多容易,但是您不知道背後的數據,但我會盡量嘗試。這意味着在源控制數據庫,列出文件的SQL查詢 - 顯示源文件路徑並排側其最近簽入的版本路徑:需要幫助將CTE查詢翻譯成linq(而不是遞歸)
WITH [recentCheckins] AS (
SELECT [SourceFileID], MAX([Version]) AS [LatestVersion]
FROM [Checkin]
GROUP BY [SourceFileID]
) SELECT
[sf].[Path], -- current version
[ci].[ArchivePath] -- most recent previous checkin
FROM
[recentCheckins]
INNER JOIN [SourceFile] [sf] ON [recentCheckins].[SourceFileID]=[sf].[ID]
INNER JOIN [Checkin] [ci] ON
[recentCheckins].[SourceFileID]=[ci].[SourceFileID] AND
[recentCheckins].[LatestVersion]=[ci].[Version]
這是我可以做的最:
var query2 =
from latestCheckins in (
from checkin in _project.Checkin
group checkin by checkin.SourceFileID into results
select new
{
SourceFileID = results.Key,
LatestCheckinVersion = results.Max(s => s.Version)
})
join sourceFile in _project.SourceFile on latestCheckins.SourceFileID equals sourceFile.ID
join checkins in _project.Checkin on // fails on this line, does not like join keyword here
new { latestCheckins.SourceFileID, latestCheckins.LatestCheckinVersion }
equals new { checkins.SourceFileID, checkins.Version }
select new
{
Filename = sourceFile.Path,
CheckinDate = checkins.DateCreated,
TaskID = checkins.TaskID,
Comments = checkins.Comments,
Version = latestCheckins.LatestCheckinVersion.ToString(),
NewFile = _project.GetSourceFilename(sourceFile.Path),
OldFile = checkins.ArchivePath,
ID = sourceFile.ID
};
帶有CTE的查詢是遞歸的。 Linq不能在一個語句中執行遞歸查詢。你將不得不單獨查詢每個級別,或者對遞歸查詢進行查看,並使用linq的數據源。 – 2013-02-24 10:20:11
我想我不明白在CTE的背景下什麼是遞歸的意思,但是謝謝你,我可以通過寫你的建議作爲單獨的查詢來解決。 – 2013-02-28 04:34:12