F# Power Pack Linq Issue
У меня есть простая функция, которая использует блок питания F# для преобразования цитаты в выражение linq. Функция:
let toLinq (exp : Expr<'a -> 'b>) =
let linq = exp.ToLinqExpression()
let call = linq :?> MethodCallExpression
let lambda = call.Arguments.[0] :?> LambdaExpression
Expression.Lambda<Func<'a, 'b>>(lambda.Body, lambda.Parameters)
Я использую эту функцию для создания выражений, которые используются библиотекой C#, которая использует linq to sql для запроса базы данных. Например, я мог бы построить выражение как:
let test = toLinq (<@fun u -> u.FirstName = "Bob"@> : Expr<Account->bool>)
и передать его в метод, как:
public IEnumerable<T> Find(Expression<Func<T, bool> predicate)
{
var result = Table.OfType<T>();
result = result.Where(predicate)
var resultArray = result.ToArray();
return resultArray;
}
Это работало, как разработано в версии 1.9.9.9 блока питания. Однако это больше не работает в последней версии блока питания. Я получаю сообщение об ошибке: метод "Boolean GenericEqualityIntrinsic[String](System.String, System.String)" не поддерживает перевод на SQL.
Я взглянул на изменения в блоке питания, и кажется, что выражение linq, созданное с использованием новой версии, использует GenericEqualityIntrinsic для сравнения значения свойства с константой, тогда как в версии 1.9.9.9 оно использовало String.op_Equality для сравнения.
Это правильное понимание проблемы? Как использовать новую версию блока питания для преобразования цитат в выражения linq, которые могут использоваться библиотекой aC#, использующей linq для sql?
2 ответа
Вы можете попробовать цитату как:
<@fun u -> u.FirstName.Equals("Bob")@>