2011-06-23 80 views
1

我想轉換下面的查詢,從查詢語法(這是正常工作),以LINQ的語法,但我似乎無法得到它的權利:LINQ to SQL的遞歸問題

SELECT 
    [t1].[ID], [t1].[ParentID], [t1].[FolderName], 
    [t1].[Purpose], [t1].[IsSystem],t1].IsHidden], 
    [t1].[ChangeSrc], [t1].[SyncGUID], [t1].[CreationDBTimeStamp] 
FROM [dbo].[FileStorageFolders] AS [t0] 
INNER JOIN [dbo].[FileStorageFolders] AS [t1] ON ([t0].[ID]) = [t1][ParentID] 
WHERE ([t1].[Purpose] = @p0) 
    AND ([t1].[FolderName] = @p1) 
    AND ([t0].[ParentID] IS NULL) 
    AND ([t0].[Purpose] = @p2) 

我用這個LINQ語法,但結果始終爲空值:

private static FileStorageFolder GetCapsuleContentFolder(FileStorageDataContext db) 
    { IQueryable<FileStorageFolder> source = (from dbfolder in db.FileStorageFolders 
      join dbsubfolder in db.FileStorageFolders on 
       new { ParentID = dbfolder.ID } equals 
       new { ParentID = Convert.ToInt32(dbsubfolder.ParentID) } 
      where 
       dbfolder.ParentID == null && 
       dbfolder.Purpose == 'REPORT' && 
       dbsubfolder.Purpose == 'LayoutFolder' && 
       dbsubfolder.FolderName == 'LayoutReport' 
      select new 
        { 
         dbsubfolder.ID, 
         ParentID = (System.Int32?)dbsubfolder.ParentID, 
         dbsubfolder.FolderName, 
         dbsubfolder.Purpose, 
         dbsubfolder.IsSystem, 
         pqrentID2 = dbfolder.ParentID, 
         Purpose2 = dbfolder.Purpose 
        }) as IQueryable<FileStorageFolder>; 
return source.Single(); 
} 
+4

每當我看到像這樣的問題時,我會問:爲什麼不能只調用一個存儲過程或將其創建爲視圖並使用LINQ來構建投影? –

+0

非常感謝Ray ......但通過另一種瞭解朋友的方式可以提高我們處理問題的能力。那是對的嗎? –

+0

如果你在查詢中放置斷點並查看原始SQL有什麼區別? – TheRealTy

回答

0

您是否收集了父母的子女撫養費?你應該如果你的關係被映射。在這種情況下,你可以嘗試:

var query = from dbFolder in db.FileStorageFolders 
      from subFolder in dbFolder.SubFolders // Here I use that mapped relations 
      where ... 
      select new { ... }; 

與您的查詢的問題是,你正在創建匿名類型,並將其轉換爲你的類型 - 這是不可能的。它也不是完整的分層查詢(你的SQL不是那麼好)。它將只選擇一個級別的子文件夾。

+0

Yups ...我認爲你給我的想法。感謝alot Ladislav ... –

+0

所以...什麼suppost我有待改變查詢到我的集合(源)... –

+0

這是正確的,我想從1表返回1行。但是這個類實現了IQueryable.do,你有什麼想法嗎? –