Почему запись FSharp.Data.SqlClient отображается как объект?

Я работаю над демонстрацией, где я могу показать, как легко использовать провайдер типа SqlClient в библиотеке F#, а затем использовать его из 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();

В коде выше я исключил, чтобы получить intellisense на y в лямбде, но ничего. Есть идеи?

1 ответ

Решение

Потому что SqlCommandProvider стирает типы вида. Это означает, что генерируемые им типы могут потребляться только из F#. Наоборот, SqlEnumProvider из той же библиотеки FSharp.Data.SqlClient является генерируемым типом типов и может использоваться C# (через прокси-проект). Это особенно хорошо работает, когда CLIEnum=true. Более подробное обсуждение стертых и сгенерированных типов см. В разделе Как создать провайдер типа F#, который можно использовать из C#?

Другие вопросы по тегам