我试图从查询中取回Envelope。信封定义如下。f#:只有无参数的构造函数和初始值设定项在LINQ to Entities中受支持
[<CLIMutable>]
type Envelope<'T> = {
Id : Guid
StreamId: Guid
Created : DateTimeOffset
Item : 'T }
MyLibAAS.DataStore.MyLibAASDbContext是一个用C#编写的EF DbContext。当我在F#它扩展如下,我得到的错误:Only parameterless constructors and initializers are supported in LINQ to Entities.
type MyLibAAS.DataStore.MyLibAASDbContext with
member this.GetEvents streamId =
query {
for event in this.Events do
where (event.StreamId = streamId)
select {
Id = event.Id;
StreamId = streamId;
Created = event.Timestamp;
Item = (JsonConvert.DeserializeObject<QuestionnaireEvent> event.Payload)
}
}
如果我回到事件并将其映射在事后信封,它工作正常。
type MyLibAAS.DataStore.MyLibAASDbContext with
member this.GetEvents streamId =
query {
for event in this.Events do
where (event.StreamId = streamId)
select event
} |> Seq.map (fun event ->
{
Id = event.Id
StreamId = streamId
Created = event.Timestamp
Item = (JsonConvert.DeserializeObject<QuestionnaireEvent> event.Payload)
}
)
为什么这会有所作为?信封类型甚至不是EF类型。
关于为什么无参数构造函数工作的理论是错误的。 –
我已经阅读了你的(非常全面的)答案,但它并没有完全解决这个问题。如果我声明一个'type Foo()= do MsgBox(“foo”)',并且我在L2E查询表达式中调用该无参数构造函数,会发生什么? – piaste
取决于查询中如何使用该构造函数。如果构造函数用于构造从查询返回的值(例如,在最后的'select'语句中),那么您会为每个返回的行获取一个消息框。如果使用构造函数创建一些未从查询返回的中间值,则不会收到消息框。 –