У меня есть простая функция, которая использует блок питания 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 для 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, которые могут использоваться библиотекой c #, использующей linq для sql?