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

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进行智能提示,但是没有出现。有什么想法吗?
1个回答

3

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


1
请查看Tomas Petricek在此处的更详细答案:https://dev59.com/Hmct5IYBdhLWcg3wZcqL#12118966 - Chester Husk
谢谢。我以为我有一个早期的例子,我直接使用它,但我想我的记忆正在失效。然而,那将是一个很好的功能,因为它会使在C#项目中使用它更容易。这样就可以偷偷地加入F# :)。当然,现在也可以这样做,但是在使用它之前必须进行额外的映射。这没关系,但需要多做一些工作。 - Tomas Jansson
@TomasJansson 很不幸,从擦除类型到生成类型的更改需要进行大量工作。 - Dmitry Morozov
这也是我所阅读的,并且完全理解它并没有被优先考虑,对于开源软件来说,你只有那么多时间。 - Tomas Jansson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接