3

我正在做一个演示,我可以在其中展示在 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,但什么也没有。有任何想法吗?

4

1 回答 1

3

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

于 2015-06-09T20:48:45.950 回答