在F#中为C#对象初始值设定项创建LINQ表达式

taor4pac  于 2022-12-06  发布在  C#
关注(0)|答案(1)|浏览(149)

我使用的.NET框架允许在从C#调用时传递对象初始化器LINQ表达式:

db.UpdateAdd( () => new InvoiceAccount { Quantity = 3 } );

架构会使用参数中的运算式来侦测应该更新哪些字段。
有没有可能从F#构造相同的LINQ表达式?我尝试使用引号来模拟对象初始化器,但到目前为止没有任何成功。我尝试了以下示例:

let expr = 
        <@ fun () -> InvoiceAccount(Quantity = 3M) @>
        |> LeafExpressionConverter.QuotationToExpression 
        |> unbox<Expression<Func<InvoiceAccount>>>

db.UpdateAdd<InvoiceAccount>( expr )

它编译时没有错误,但我得到以下运行时错误:
System.NotSupportedException:未能将以下F#引号转换为LINQ表达式树
顺序(顺序(值(),属性集(一些(返回值),数量,[调用(无,生成十进制,[值(3),值(0),值(0),值(假),值(0uy)])]),返回值)
第666行:第666行:第666行:第666行:第666行:第666行:第666行:第666行:第666行

k97glaaz

k97glaaz1#

这将构造一个等效表达式:

let invoiceAccountCtor = typedefof<InvoiceAccount>.GetConstructor([||])
let quantityProp = typedefof<InvoiceAccount>.GetMember(nameof Unchecked.defaultof<InvoiceAccount>.Quantity).Single()
let expr =
    Expression.Lambda(
        Expression.MemberInit(
            Expression.New(invoiceAccountCtor),
            [|
                Expression.Bind(quantityProp, Expression.Constant(3)) :> MemberBinding
            |]),
        [||])

相关问题