.net core 如何在忽略泛型类型的情况下对F#进行向下转换?
考虑以下带有向下投射的代码:.net core 如何在忽略泛型类型的情况下对F#进行向下转换?,.net-core,f#,graphql,entity-framework-core,.net Core,F#,Graphql,Entity Framework Core,考虑以下带有向下投射的代码: let list = [1; 2; 4] :> obj // Successful let list2 = list :?> int list // Exception - System.InvalidCastException let list3 = list :?> obj list let list4 = list :?> _ list 基本上,我希望向下转换到列表集合,但实际上忽略泛型类型参数。但是,它为list3和list4抛
let list = [1; 2; 4] :> obj
// Successful
let list2 = list :?> int list
// Exception - System.InvalidCastException
let list3 = list :?> obj list
let list4 = list :?> _ list
基本上,我希望向下转换到列表集合,但实际上忽略泛型类型参数。但是,它为list3
和list4
抛出InvalidCastException
异常。有没有办法做到这一点
作为一个上下文,我尝试接受Linq表达式列表,以便像这样从DBContext
进行急切抓取,以解决GraphQL查询中依赖实体的N+1选择问题。我不能真的对某一种类型感到沮丧。表达式必须在循环中降级为通用版本表达式
:
let getTenants (db: Context) takeItems skipItems =
let expr1 =
<@ Func<_, _>(fun x -> x.TenantConfig) @>
|> LeafExpressionConverter.QuotationToExpression
let expr2 =
<@ Func<_, _>(fun x -> x.Invitations) @>
|> LeafExpressionConverter.QuotationToExpression
// This list of includes expressions will be passed by the caller eventually
let exprs = [expr1; expr2]
let q =
List.fold
(fun (acc: IQueryable<Tenant>) (x: Expression) ->
let expr = x :?> Expression<Func<Tenant, _>>
acc.Include(expr) :> IQueryable<Tenant>)
(db.Tenant.AsQueryable())
exprs
query {
for tenant in q do
skip skipItems
take takeItems
select tenant
}
|> fun x -> x.ToListAsync()
|> Async.AwaitTask
|> Async.map Seq.toList
让gettenant(db:Context)获取项目skipItems=
让expr1=
x、 租户配置)@>
|>LeafExpressionConverter.QuotationToExpression
让expr2=
x、 邀请)@>
|>LeafExpressionConverter.QuotationToExpression
//此包含表达式列表最终将由调用方传递
设exprs=[expr1;expr2]
让q=
List.fold
(乐趣(acc:IQueryable)(x:Expression)->
设expr=x:?>表达式
附件包括(expr):>IQueryable
(db.Tenant.AsQueryable())
出口
质疑{
对于q do中的租户
跳绳
带上随身携带的物品
选择租户
}
|>乐趣x->x.ToListSync()
|>异步任务
|>Async.map Seq.toList
我可以使用基于字符串的iQueryTable版本仅处理向下转换,F#不支持协方差(C#支持),例如,您认为列表值支持列表接口,因为int支持obj。在F#中,您必须将列表中的元素“映射”到一个对象。@MrDatKookerellaLtd这太糟糕了。有没有办法绕过或解决上述问题?某种类型的部分类型匹配或其他什么?你要么映射,要么“cast”…查找“contrance f#”…我将阅读你问题的其余部分,看看我是否能帮你将表达式以1×1的形式传递,那么您就不需要一些常见类型了。@MrDatKookerellaLtd表达式是未知的,在我遍历传入的GraphQL查询时是动态创建的。我把那棵树夷为平地,列了一个目录。当函数-getTenants
位于DAL层时,这种映射发生在BAL层。