クエリからエンベロープのバックを取得しようとしています。エンベロープは次のように定義されます。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タイプではありません。
なぜパラメーターなしコンストラクターが動作するかについてのあなたの理論は間違っています。 –
私はあなたの(非常に徹底的な)答えを読んだが、それは私のためにその点をかなり解決しなかった。 'Foo()= do MsgBox(" foo ")'型を宣言し、そのパラメータのないコンストラクタをL2Eクエリ式の中で呼び出すと、どうなりますか? – piaste
コンストラクタがクエリ内でどのように使用されるかによって異なります。コンストラクタを使用してクエリから返される値を構築する場合(たとえば、最後の 'select'文など)、返される行ごとにメッセージボックスが表示されます。コンストラクタを使用してクエリから返されない中間値を作成すると、メッセージボックスは表示されません。 –