在做LINQ到SQL在C#中,你可以做這樣的事情:可組合FLinq表達式
var data = context.MyTable.Where(x => x.Parameter > 10);
var q1 = data.Take(10);
var q2 = data.Take(3);
q1.ToArray();
q2.ToArray();
這將產生2個獨立的SQL查詢,一個與TOP 10,和其他與TOP 3。在玩Flinq時,我看到:
let data = query <@ seq { for i in context.MyTable do if x.Parameter > 10 then yield i } @>
data |> Seq.take 10 |> Seq.toList
data |> Seq.take 3 |> Seq.toList
不是做同樣的事情。在這裏它似乎做了一個完整的查詢,然後在客戶端執行「take」調用。我看到的一個替代方案是:
let q1 = query <@ for i in context.MyTable do if x.Param > 10 then yield i } |> Seq.take 10 @>
let q2 = query <@ for i in context.MyTable do if x.Param > 10 then yield i } |> Seq.take 3 @>
這兩個生成的SQL使用適當的TOP N過濾器。我的問題是它看起來不可組合。我基本上必須複製「where」子句,並且可能需要複製其他可能需要在基本查詢上運行的其他子查詢。有沒有辦法讓F#給我更多的組合?
(我本來posted this question to hubfs,在那裏我已經得到了一些答案,處理與C#進行查詢轉換「底」,即當需要數據,其中F#是急切地做這種轉變的事實。)