我有這種方法,這需要Expr的作爲參數:F# - 「不是有效的屬性表達」
member x.HasSeq (expr:Expr<'a -> 'b seq>) =
let casted = <@ fun z -> (%expr) z :?> ICollection<'b> @>
ManyNavPropertyInfo(cfg.HasMany <| toLinq casted)
我想是到'b seq
強制轉換爲ICollection<'b>
,這似乎爲它工作應該,但是當它到達到哪裏去給Expr的轉換爲LINQ線(需要這樣做,因爲cfg.HasMany
節選一System.Expression<Func<'a,ICollection<'b>>>
)它只是拋出一個異常說:
出現InvalidOperationException:
表達 'Z => UnboxGeneric(ToFSharpFunc(Z => z.Books).Invoke(Z))' 是不是一個有效 屬性表達。表達式 應表示一個屬性:C#:'t => t.MyProperty'VB.Net:'Function(t) t.MyProperty'。
我用expr的轉換爲LINQ的功能:前
let toLinq (exp : Expr<'a -> 'b>) =
let linq = exp.ToLinqExpression()
let call = linq :?> MethodCallExpression
let lambda = call.Arguments.[0] :?> LambdaExpression
Expression.Lambda<Func<'a, 'b>>(lambda.Body, lambda.Parameters)
我用toLinq
功能沒有問題 - 我想這是因爲我投b seq
到ICollection<'b>
這讓在Expr
UnboxGeneric
和當通過Expr
到toLinq
它簡直不知道該怎麼處理UnboxGeneric
- 但當然這只是一個理論,我不知道該怎麼做才能解決它。
最後一種方法看起來很有趣,但我不確定如何混合'Expr.Lambda'和'Expr.PropGet'來構建表達式樹。你介意給出一個解釋; =)? – ebb 2011-04-25 13:40:16
如果我讓函數期望''a - > ICollection <'b>',那麼當你調用函數時,你只需要拋出'seq <'b>',這會產生相同的錯誤。 – ebb 2011-04-25 13:45:36