F# Powerpack и Entity Framework: как реорганизовать общую часть двух запросов

У меня есть два запроса:

 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 @>

Я хотел бы реорганизовать это так, чтобы два

 fun currentUser -> currentUser.Id = userId

Может быть один метод, как:

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#, меня это немного смущает, поскольку я уверен, что это можно сделать в C# с помощью метода, возвращающего Func. Тем не менее, я понимаю, что с самого начала есть различия, поскольку F# использует другую библиотеку для построения запросов linq.

1 ответ

Решение

Это работает, если вы измените свой метод для возврата 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)) @>
Другие вопросы по тегам