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 ответа

Решение

Звонит явно

System.String.op_Equality(s1,s2)

Работа?

Вы можете попробовать цитату как:

<@fun u -> u.FirstName.Equals("Bob")@>
Другие вопросы по тегам