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
F# 为什么FSharp.Data.SqlClient记录作为对象公开?_F#_Fsharp.data.sqlclient - Fatal编程技术网

F# 为什么FSharp.Data.SqlClient记录作为对象公开?

F# 为什么FSharp.Data.SqlClient记录作为对象公开?,f#,fsharp.data.sqlclient,F#,Fsharp.data.sqlclient,我正在做一个演示,在那里我可以展示在F#库中使用SqlClient类型提供程序,然后从C#中使用它是多么容易,我认为这可能是一种将东西引入项目的方法。由于许多使用C#的人希望使用接口等,我想我向他们展示了将所有东西结合起来是可能的,但我没有得到预期的结果。我有以下F#代码,它在F#中按预期工作: 在上面的代码中,我尝试在lambda中的y上获取intellisense,但什么都没有。有什么想法吗?因为SqlCommandProvider正在擦除类型。这意味着它生成的类型只能从F#中使用。相反,来

我正在做一个演示,在那里我可以展示在F#库中使用SqlClient类型提供程序,然后从C#中使用它是多么容易,我认为这可能是一种将东西引入项目的方法。由于许多使用C#的人希望使用接口等,我想我向他们展示了将所有东西结合起来是可能的,但我没有得到预期的结果。我有以下F#代码,它在F#中按预期工作:


在上面的代码中,我尝试在lambda中的
y
上获取intellisense,但什么都没有。有什么想法吗?

因为SqlCommandProvider正在擦除类型。这意味着它生成的类型只能从F#中使用。相反,来自同一FSharp.Data.SqlClient库的SqlEnumProvider是由C#(通过代理项目)生成的。当CLIEnum=true时,它的效果特别好。 有关擦除类型与生成类型的更深入讨论,请参阅

从这里可以看到更详细的答案:谢谢。我想我有一个早期的例子,我确实直接消耗了它,但我想我的记忆力正在衰退。然而,这将是一个很好的特性,因为它将使它更易于在C#项目中使用。这样你就可以偷偷溜进去。当然,您现在也可以这样做,但是在C#中使用它之前,您必须进行额外的映射。这很好,但需要做更多的工作。@Tomasjanson不幸的是,从擦除类型到生成类型要做的工作要多得多。这也是我读到的,我完全理解它没有被优先考虑,使用开源的东西你只有这么多时间。
module Orders = 
    [<Literal>]
    let connStr = """XXXXXXXXXXXX"""
    type OrdersPerEmployee = SqlCommandProvider<"OrdersPerEmployee.sql", connStr>

open Orders
type IOrdersRepo =
    abstract member getOrdersPerEmployee : int -> OrdersPerEmployee.Record seq
type OrdersRepo() =
    interface IOrdersRepo with
        member this.getOrdersPerEmployee(employeeId) = 
            let query = new OrdersPerEmployee()
            query.Execute(employeeId)