递归查询理解(F#3.0)
我试图使用最近引入的F#3.0查询理解语法定义BOM表类查询。虽然可以使用递归查询理解(F#3.0),f#,F#,我试图使用最近引入的F#3.0查询理解语法定义BOM表类查询。虽然可以使用yield来定义这类查询seq内存中集合的理解我不乏将这些集合转换为以可远程IQueryable源为目标的查询理解。我想困难的部分是“训练”提供者从递归模式中识别公共表表达式 有什么想法吗?不幸的是,我不认为F#3.0中当前的查询语法支持能够处理递归查询。主要问题是F#3.0依赖于主要为C#设计的标准IQueryable实现,因此它们不需要递归结构 我认为支持这一点相当困难。您可以实现自己的F#Quotes to SQL
yield来定义这类查询
seq内存中集合的理解我不乏将这些集合转换为以可远程IQueryable源为目标的查询理解。我想困难的部分是“训练”提供者从递归模式中识别公共表表达式
有什么想法吗?不幸的是,我不认为F#3.0中当前的查询语法支持能够处理递归查询。主要问题是F#3.0依赖于主要为C#设计的标准
IQueryable
实现,因此它们不需要递归结构
我认为支持这一点相当困难。您可以实现自己的F#Quotes to SQL translator(这很难),也可以实现某种预处理器,它接受包含递归的F#Quotes(查询),并将递归转换为LINQ to SQL translator可以处理的内容(但这可能也很难)
通常,方法是定义自己的查询生成器:
open System.IO
open Microsoft.FSharp.Quotations
type MyQueryBuilder() =
member x.For(a, body) = Seq.collect body a
member x.Quote(e) = e
member x.YieldFrom(s) = s
member x.Run(e:Expr<'T>) : 'T = failwithf "%A" e
// Example using the custom query builder
// (fails, printing the quoted query)
let mquery = MyQueryBuilder()
let n = [1 .. 10]
let rec nums a : seq<int> =
mquery { for b in n do
yield! nums b }
opensystem.IO
打开Microsoft.FSharp.quotes
类型MyQueryBuilder()=
(a,主体)的成员x=以下集合主体a
成员x.Quote(e)=e
成员x.YieldFrom(s)=s
成员x.Run(e:ExprI)不想惹人讨厌,但如果你打算再次在这里发帖,你可能希望看看这个:你不需要签名或标语,事实上这有点令人沮丧。