F# 中的 Seq 和 IQueryable

Art*_*his 2 f#

我正在使用 F# 阅读 Web 云和移动解决方案,并尝试关注作者正在构建的网站。但是我有一些问题,我无法解决。我理解我正在做的事情的逻辑,但看起来缺少一些代码来使它工作。我已经阅读了第 19 页。

我有以下存储库模块:

module Repository =
    let get (source : IQueryable<_>) queryFn=
        queryFn |> Seq.toList

    let getAll ()= 
        fun s -> query { for x in s  do
                         select x }
Run Code Online (Sandbox Code Playgroud)

这个想法是在 queryFn 中使用 getAll 从源中获取所有项目。但是我在两者之间有一个演员问题。

这是使用它的控制器:

[<HandleError>]
type GuitarsController(context : IDisposable, ?repository ) =
    inherit Controller()


    let fromRepository =
        match repository with
        | Some v -> v
        | _ -> (context :?>  FsMvcAppEntities).guitars
                |> Repository.get



    new() = new GuitarsController(new FsMvcAppEntities())

    member this.Index() =
        getAll()
        |> fromRepository
        |> this.View
Run Code Online (Sandbox Code Playgroud)

getAll() 不适用于 |> fromRepository。

类型 ''b -> Linq.IQueryable<'c>' 与类型 'seq<'a>' 不兼容。

查看存储库模块中定义的类型时,我可以看到 queryFn 是:

val get : source:IQueryable<'a> -> queryFn:seq<'b> -> 'b list
Run Code Online (Sandbox Code Playgroud)

和 getall 给

 unit -> s:System.Linq.IQueryable<'a> -> System.Linq.IQueryable<'a>
Run Code Online (Sandbox Code Playgroud)

Grz*_*z W 5

Repository.get没有使用source:D。

将其更改为:

module Repository =
    let get (source : IQueryable<_>) queryFn =
        queryFn source |> Seq.toList
Run Code Online (Sandbox Code Playgroud)