【发布时间】:2016-08-17 12:28:47
【问题描述】:
我想从提供的数据结构中创建一个等效于query { ... } 计算表达式的方法(将FSharp.Data.TypeProviders 与LINQ2SQL 或LINQ2Entities 一起使用),即:
Collection("customers", [
Field "customerId";
Collection("orders", [
Field "orderId" ]) ])
为此,我首先需要了解查询是如何转换为代码的。以以下查询为例:
query {
for c in db.Customers do
select (c.CustomerID, query {
for o in c.Orders do
select o.OrderID
} |> Seq.toList)
}
没有计算表达式语法会是什么样子?
【问题讨论】:
-
计算表达式的一个很好的介绍是fsharpforfunandprofit.com/series/computation-expressions.html。每个关键字对应的内容在 MSDN 中有详细记录 - 例如,
for ... in转换为对构建器类型上的For函数的调用。要获得发出的确切代码,您始终可以使用反编译器。 -
谢谢卢安。不幸的是,我在尝试使用
query表达式进行直接翻译时失败了。我也尝试阅读反编译的代码。然而,这个查询的主体结果是 typeof 和字节数的混合,直接写入一个数组并使用单一方法调用 - 可能该查询主体的一部分实际上是 F# 引用。你也不是特别适合人类阅读。 -
SQL Access 的类型提供程序有很多。自版本 3 起,F# 已经提供了类型提供程序 over EF 和 L2S。但是..
-
使用FSharp.Data.SqlClient's SqlCommandProvider 虽然您根本不需要映射。提供者将表公开为类型。将其视为类型安全、启用 LINQ 的 Dapper 等价物
-
@Panagiotis Kanavos - 如果您仔细阅读我的问题,您的所有问题都已经得到解答: 1. 我已经提到了我正在使用的特定 NuGet 包(
FSharp.Data.TypeProviders示例中带有 LinqToSql )。 2.我还需要返回具有嵌套一对多关系的实体(也在示例中给出)。所以 Dapper-like 提供者不会帮助我。在这里擦除类型提供程序也可能会失败。 3. 我明确提到我需要解构一个query(所有暴露query表达式的类型提供程序都在SQL 数据库上工作)。
标签: f#