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