Linq to sql 可组合FLinq表达式
在c#中执行linq to sql时,可以执行以下操作:Linq to sql 可组合FLinq表达式,linq-to-sql,f#,Linq To Sql,F#,在c#中执行linq to sql时,可以执行以下操作: var data = context.MyTable.Where(x => x.Parameter > 10); var q1 = data.Take(10); var q2 = data.Take(3); q1.ToArray(); q2.ToArray(); 这将生成两个单独的SQL查询,一个查询前10名,另一个查询前3名。在与Flinq的游戏中,我看到: let data = query <@ se
var data = context.MyTable.Where(x => x.Parameter > 10);
var q1 = data.Take(10);
var q2 = data.Take(3);
q1.ToArray();
q2.ToArray();
这将生成两个单独的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
let data=query 10然后产生i}@>
数据|>序号取10 |>序号列表
数据|>序号取3 |>序号列表
他不是在做同样的事情。在这里,它似乎执行一个完整的查询,然后在客户端执行“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 @>
让q1=query 10然后产生i}|>Seq.take 10@>
让q2=查询10,然后产生i}|>Seq.take 3@>
这两个函数使用适当的TOP N筛选器生成SQL。我的问题是它似乎不可组合。我基本上必须复制“where”子句,并且可能必须复制我可能希望在基本查询上运行的其他子查询。有没有办法让F#给我一些更可组合的东西
(我最初得到了一些答案,处理C#在“最后”执行查询转换的事实,即当需要数据时,F#急切地进行转换。)要在F#中执行此操作,需要使用稍微不同的方法。您需要构造带引号的F#代码,而不是使用方法调用(和延迟执行)组合查询。如果只需要通过某个数值参数对代码进行参数化,则可以编写一个运行查询的函数:
let takeData count =
<@ seq { for i in context.MyTable do
if x.Parameter > 10 then
yield i }
|> Seq.take count @> |> query
这里,op
参数的类型为Expr'a>
。您可以使用一些引号作为参数调用createQuery
函数,它将在核心查询之后追加参数。例如:
createQuery <@ Seq.take 10 @>
createQuery <@ Seq.sortBy (fun x -> x.Parameter) @>
createQuery <@ Seq.take 10 @>
createQuery <@ Seq.sortBy (fun x -> x.Parameter) @>
(fun x -> <@ .. %x .. @>)