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

1 ответ

Expr ли он, если вы измените свой метод, чтобы вернуть 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)) @>

licensed under cc by-sa 3.0 with attribution.