.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层。