Почему запись 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#?