F # Power Pack Linq Issue - PullRequest
       36

F # Power Pack Linq Issue

2 голосов
/ 22 июня 2011

У меня есть простая функция, которая использует блок питания 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?

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

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

<@fun u -> u.FirstName.Equals("Bob")@>
2 голосов
/ 22 июня 2011

Звонит явно

System.String.op_Equality(s1,s2)

работа

...