5

匿名型が機能するクエリを取得しようとしています。

let temporaryBookModel =
  query <@ context.Books 
    |> Seq.filter (fun book -> book.Id = bookId)
    |> Seq.map(fun item -> (item.Id, item.ParentUser.Id, item.ParentUser.Alias, item.Tagline, item.Title, item.Visible, item.CreatedDate))
    |> Seq.head @>

そして私は続けています:

{"でサポートされているのはパラメータなしのコンストラクタと初期化子だけです   エンティティへのLINQ。 "}

値を型に直接マッピングしていたとしても意味がありますが、匿名型はオブジェクト初期化機能に基づいているので、この例外をスローしてはいけません。残念ながら、匿名型で見つけたものはすべてこれが正しい構文だと言っているようです。それかこれのようなもの:

let temporaryBookModel =
  query <@ context.Books 
    |> Seq.filter (fun book -> book.Id = bookId)
    |> Seq.map(fun item -> (("a", item.Id), ("b", item.ParentUser.Id), ("c", item.ParentUser.Alias), ("d", item.Tagline), ("e", item.Title, item.Visible), ("f", item.CreatedDate)))
    |> Seq.head @>


  • F#には匿名型の概念はありません。 - これはC#の機能です。ここでは普通のタプルを作成しています。 - ildjarn
  • エラーをより具体的な構成体に分離してみましたか(つまり、まずSeq.map(fun i - > i.Id)、Seq.map(fun i - > i.Id、i.Id)を試してください)、等。? - fmr

1 답변


3

F#は匿名型をサポートしますか?

私が知っているように - それは違います。しかし、回避策は2つあります。

  • タプルを使う(あなたが使っているように)
  • レコードタイプを使用しますが、この場合は事前にレコードを定義する必要があります。このようなもの:
type Book =
    { 
        Id: int;
        ParentId: int;
        ParentAlias: string;
        TagLine: string;
        Title: string;
        Visible: bool;
        CreatedDate: DateTime;
    }

使い方のコード行は次のようになります。

...
|> Seq.map 
    (fun item -> 
        {
            Id = item.Id; 
            ParentId = item.ParentUser.Id;
            ParentAlias = item.ParentUser.Alias;
            TagLine = item.Tagline;
            Title = item.Title;
            Visible = item.Visible;
            CreatedDate = item.CreatedDate
        }) 

あなたが同様の質問で見つけることができるより多くの説明ここに

更新:

私にとってのレコードタイプの使用法は、より洗練された解決策です、しかしEntity Frameworkでは動作しないようです - F# - >パラメータなしのコンストラクタで記録しますか?

だからTomas Petricekの回答によると - それはコンストラクタと必要なプロパティの少ないパラメータで明示型を宣言する必要があります。

リンクされた質問


関連する質問

最近の質問