0

2 つのクエリがあります。

 member private x.CheckIfUserExistsUsingId(userId:int, context:StoryBoardContext) =
  <@ context.Users 
     |> Seq.exists (fun currentUser -> currentUser.Id = userId) @>

member private x.FindUserById(userId:int, context:StoryBoardContext) =
 <@ context.Users 
    |> Seq.filter(fun currentUser -> currentUser.Id = userId) 
    |> Seq.head @>

これをリファクタリングして、2 つの

 fun currentUser -> currentUser.Id = userId

次のような 1 つの方法にすることができます。

member private x.IfUserIdMatches (userId:int) = 
  fun (currentUser:User) -> currentUser.Id = userId

そしてそれを使用します:

member private x.CheckIfUserExistsUsingId(userId:int, context:StoryBoardContext) =
  <@ context.Users 
     |> Seq.exists (x.IfUserIdMatches (userId)) @>

しかし、私はエラーが発生し続けます:

The following construct was used in query but is not recognised by the F#-to-LINQ query translator...

これにより、メソッドの署名が不十分に構築されていると思います。F# を初めて使用するので、Func を返すメソッドを使用して C# でこれを実行できると確信しているため、少し混乱しています。ただし、F# は異なるライブラリを使用して linq クエリを構築しているため、すぐに違いがあることを理解しています。

4

1 に答える 1

2

メソッドを return に変更すると機能しますかExpr

member private x.IfUserIdMatches (userId:int) = 
  <@ fun (currentUser:User) -> currentUser.Id = userId @>

スプライシングを使用しますか?

member private x.CheckIfUserExistsUsingId(userId:int, context:StoryBoardContext) =
  <@ context.Users 
      |> Seq.exists %(x.IfUserIdMatches (userId)) @>
于 2011-12-01T23:04:59.213 に答える