f# - F# 中的 Seq 和 IQueryable

标签 f#

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

我有以下存储库模块:

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

    let getAll ()= 
        fun s -> query { for x in s  do
                         select x }

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

这是使用它的 Controller :

[<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

getAll() 不适用于 |> fromRepository。

The type ''b -> Linq.IQueryable<'c>' is not compatible with the type 'seq<'a>'.

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

val get : source:IQueryable<'a> -> queryFn:seq<'b> -> 'b list

getall 给出

 unit -> s:System.Linq.IQueryable<'a> -> System.Linq.IQueryable<'a>

最佳答案

您的 Repository.get 没有使用 source :D。

将其更改为:

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

关于f# - F# 中的 Seq 和 IQueryable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14519788/

相关文章:

c# - 如何使用 Deedle 进行基于行的处理(帧输入和帧输出)

f# - 如何匹配一个值的多个副本?

f# - Intellisense 不适用于 F# 类型提供程序

F#异步;在同一个线程中运行异步表达式,并且能够等待异步操作(例如做!)

indexing - ( F#) 索引字符串而不对字符串进行类型注释

reflection - 如何从 Case 实例中获取 Discriminated Union Type?

f# - 如何覆盖内置集合中的 tostring

f# - F#中矩阵计算的改进

enums - 如何迭代枚举,并转换 obj

f# - 如何在 F# 上制作没有参数的功能包装器?