4

動作するコードはこの質問の一番下にあります!

F#で次のWebApiコントローラーを使用する場合:

namespace FsWeb.Controllers

open System.Web
open System.Web.Mvc
open System.Net.Http
open System.Web.Http
open Microsoft.FSharp.Linq;
open Microsoft.FSharp.Data.TypeProviders;

type dbSchema = SqlDataConnection<"conn string">

[<CLIMutable>] 
type ViewModelRec = { CustomerId : string }

type ValuesController() =
    inherit ApiController()
    let db = dbSchema.GetDataContext()
    do
        db.DataContext.Log <- System.Console.Out

    // GET /api/values
    member x.Get(take:int, skip:int) = 
        let t = take
        let s = skip

        query {
            for row in db.Reservations do
            skip s 
            take t
            select { CustomerId = row.CustomerId.ToString() }
        }

XML出力は次のとおりです。

<ArrayOfViewModelRec xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/FsWeb.Controllers">
<ViewModelRec>
<CustomerId_x0040_>A98971F0-5F93-4F0D-B5AC-95E161458381</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>60DF7CF6-91FB-4BBE-AD6B-FE0CAA32F60E</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>84506E40-139C-4DD1-B396-3CE13DC20996</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>D9FABC12-9B19-46C2-9776-E31171A302D5</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>B1B6C617-AA0E-46A9-A0B6-312A229BE178</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>BAB194AE-CD2C-400F-B81E-2A293C50C404</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>AE001AB4-8410-43BF-9C93-AE5A2EACFDF5</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>2DDBDB91-9307-4BF7-865F-C6237D09D542</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>A3E93E5C-2B7E-4B8D-8AAD-AD245E32093F</CustomerId_x0040_>
</ViewModelRec>
<ViewModelRec>
<CustomerId_x0040_>B64B814F-9B4C-46BD-A804-648309FA7DD0</CustomerId_x0040_>
</ViewModelRec>
</ArrayOfViewModelRec>

代わりにクラスを使用すると、名前は正しく見えます(x0040タグなし)。

誰か提案?

更新:解決策:

namespace FsWeb.Controllers

open System.Web
open System.Web.Mvc
open System.Net.Http
open System.Web.Http
open System.Runtime.Serialization;
open Microsoft.FSharp.Linq;
open Microsoft.FSharp.Data.TypeProviders;

type dbSchema = SqlDataConnection<"here comes the connection string">

[<DataContract>]
type ViewModelRec = {
    [<field: DataMember(Name="CustomerId")>]
    CustomerId : string }

type ValuesController() =
    inherit ApiController()
    let db = dbSchema.GetDataContext()
    do
        db.DataContext.Log <- System.Console.Out

    member x.Get(take:int, skip:int) = 
        let t = take
        let s = skip

        query {
            for row in db.Reservations do
            skip s 
            take t
            select { CustomerId = row.CustomerId.ToString() }
        }
4

1 に答える 1

7

私はF#の専門家ではありませんが、私が知る限り、レコードタイプのプロパティゲッターは同じ名前の内部フィールドに支えられており、末尾に「@」が付いているだけです。あなたの場合は「CustomerId@」です。

次に、シリアライザーは、[Serializable]属性を持つC#クラスがある場合と同じように、パブリックゲッターではなく、これらのバッキングフィールドをシリアル化することを選択します。

DataContract / DataMemberを使用すると機能するはずです-F#レコードタイプのシリアル化を参照してください

于 2012-09-16T13:56:13.050 に答える