Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 可组合FLinq表达式_Linq To Sql_F# - Fatal编程技术网

Linq to sql 可组合FLinq表达式

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

在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 <@ 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) @>
  • 演示如何提供C#中无法直接使用的一些附加功能(使用一些技巧)

  • createQuery <@ Seq.take 10 @>
    createQuery <@ Seq.sortBy (fun x -> x.Parameter) @>
    
    (fun x -> <@ .. %x .. @>)