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

时间:2015-06-09 20:28:45

标签: f# fsharp.data.sqlclient

我正在进行演示,我可以展示在F#库中使用SqlClient类型提供程序然后从C#中使用它是多么容易,我认为这可能是将事情纳入项目的一种方法。由于许多使用C#的人想要使用界面等。我想我告诉他们可以将所有内容组合在一起,但我没有得到预期的结果。我有以下F#代码在F#中按预期工作:

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)

但是当我尝试在我的C#应用​​程序中使用它时,我不会得到getOrdersPerEmployee返回一个可枚举的记录,而是返回一个可枚举的对象:

IOrdersRepo repo = new OrdersRepo();
var data = repo.getOrdersPerEmployee(4).ToList();
data.ForEach(y => Console.WriteLine(y));
Console.ReadLine();

在上面的代码中,我在lambda中的y上获得了intellisense,但没有。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

因为SqlCommandProvider正在擦除类型。这意味着它生成的类型只能从F#中使用。相反,来自相同FSharp.Data.SqlClient库的SqlEnumProvider是生成类型类型并且可以由C#(通过代理项目)使用。当CLIEnum = true时,它工作得特别好。 有关擦除与生成类型的更深入讨论,请参阅 How do I create an F# Type Provider that can be used from C#?