Я думаю, что у вашего подхода есть более фундаментальная проблема, чем просто проблема, которую вы описали.Когда вы используете Where
или Any
с лямбда-выражением в C #, компилятор C # превращает лямбду в дерево выражений Expression<Func<_, _>>
, и поэтому LINQ to Entities может преобразовать код в запрос SQL.
Однако, когда вы используете лямбда-функцию F # в качестве аргумента, она будет скомпилирована как функция (или делегат типа Func<_, _>
).Это означает, что ваш код будет вызывать версию функции обработки в памяти, и вы будете выполнять всю обработку в памяти вместо того, чтобы делать это на сервере базы данных!
Чтобы написать запрос в F # 2.0, вам нужнооберните весь код внутри цитаты и запустите его, используя функцию query
из F # PowerPack (F # 3.0 сделает это намного приятнее, но, к сожалению, это всего лишь бета).Вам, вероятно, нужно что-то вроде этого:
if query <@ context.Users |> Seq.exists (fun currentUser ->
currentUser.UserName = userName) @> then
let foundUser =
query <@ context.Users
|> Seq.filter (fun usr -> usr.UserName = userName)
|> Seq.head @>
context.Users.DeleteObject(foundUser)
context.SaveAll() |> ignore
(Кроме того, я не уверен, нужно ли вам проверять, существует ли пользователь заранее - вы можете просто найти всех пользователей, используя filter
, а затем удалитьпервый, если возвращаемая последовательность содержит что-то)