2013-02-24 35 views
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 
      }; 
+0

帶有CTE的查詢是遞歸的。 Linq不能在一個語句中執行遞歸查詢。你將不得不單獨查詢每個級別,或者對遞歸查詢進行查看,並使用linq的數據源。 – 2013-02-24 10:20:11

+0

我想我不明白在CTE的背景下什麼是遞歸的意思,但是謝謝你,我可以通過寫你的建議作爲單獨的查詢來解決。 – 2013-02-28 04:34:12

回答

1

通過將它分解爲單獨的查詢,正如上面的Gert所建議的那樣,將其工作。