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