在做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#是急切地做这种转变的事实。)