При выполнении linq-to-sql в c # вы можете сделать что-то вроде этого:
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, один с ТОП 10, а другой с ТОП 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 @>
Эти 2 генерируют SQL с соответствующим фильтром TOP N. Моя проблема с этим состоит в том, что это не кажется составным. По сути, мне нужно продублировать предложение "where", и, возможно, мне придется продублировать другие подзапросы, которые я мог бы выполнить для базового запроса. Есть ли способ, чтобы F # дал мне что-то более сочетаемое?
(я изначально отправил этот вопрос на hubfs , где я получил несколько ответов, касающихся того факта, что C # выполняет преобразование запроса «в конце», то есть когда нужны данные, где F # делает это преобразование с нетерпением.)