我正在开发一个演示,其中我可以展示在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上获得智能感知,但没有任何反应。有任何想法吗?

最佳答案

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

10-01 21:19