下面是LINQ到SQL一個難倒的:LINQ2SQL組和取消在同一查詢
string p = prefix ?? "";
string d = delimiter ?? "";
var filegroups = from b in folder.GetFiles(data)
where b.Uri.StartsWith(p) && b.Uri.CompareTo(marker ?? "") >= 0
group b by data.DataContext.GetFileFolder(p, d, b.Uri);
//var folders = from g in filegroups where g.Key.Length > 0 select g;
//var files = from g in filegroups where g.Key.Length == 0 select g;
var files = filegroups.SelectMany(g => g.Key.Length > 0
? from b in g.Take(1) select new FilePrefix { Name = g.Key }
: from b in g select new FilePrefix { Name = b.Uri, Original = b });
var retval = files.Take(maxresults);
文件夾不能嵌套(在我的掌握),但文件名可以包含斜線和任何所以更深的文件夾結構可仿真
folder.GetFiles是一個簡單的LINQ當量(IOrderedQueryable)到select * from files where [email protected] order by Uri
前綴是一個過濾器說法回報只有那些有...
定界符啓動文件的路徑分隔符,如「/」
標記是分頁 - 開始在指定點返回
data.DataContext.GetFileFolder映射到一個sql標量函數:返回整個字符串直到包括在前綴字符串後面出現的下一個分隔符 RETURN substring(@uri, 0, charindex(@delimiter, @uri, len(@prefix)) + len(@delimiter))
這是爲了排除故障 - 原來是一個客戶端where子句,它正確映射到TSQL。我只是希望做一個函數會改變最終圖中的內容,但不會。
,並註釋掉文件夾和文件,作爲一切工作的預期
目標是打數據庫只有一次。我希望在一次返回時根據對FilePrefix對象的解釋來顯示子文件夾和文件(文件夾具有空「原始」值)
問題在於最終的selectmany引發「無法格式化節點」 ClientQuery'作爲SQL執行。「
我強烈懷疑,如果它不是用於TSQL翻譯的話,它可以很好地工作,但從邏輯上看,爲什麼它不執行數據庫工作,然後選擇FilePrefixes客戶端作爲最後一步?
現在已經很晚了;)但是明天我會通過滑動一個ToList()或類似的東西在那裏類似的東西來恢復雙擊數據庫,從而導致最後一步成爲完整的客戶端(kludge)。但是,如果任何人對如何在一次數據庫命中時完成這項任務有所瞭解(缺少寫入存儲過程),我很樂意聽到它!
該kludge的缺點是,如果數據庫擊中結果的記錄遠遠超過這個記錄,最終Take(maxresults)可能會很昂貴。而後來的Skip(maxresults).Take(1)
,我沒有引用,標記下一頁,會傷害兩倍。
非常感謝你
你的代碼的目的是什麼? – 2014-11-08 13:42:07
webapi雲存儲解決方案。返回的fileprefix對象將被擴展爲格式並序列化與linq對象佈局不完全匹配的響應。規定的響應混合文件夾和文件。 文件夾正在被分組模擬,文件組內的文件正在被刪除並且沒有被返回(因爲它們在子文件夾中)。在零長度組鍵中找到的文件位於'this'文件夾中,正如預期的那樣,正在返回 – thewyzard 2014-11-08 21:57:02
和yup,將'filegroups.SelectMany'更改爲'filegroups.AsEnumerable()。SelectMany'成功。 – thewyzard 2014-11-08 22:25:18