F#Power Pack Linq问题

 2021-04-27 

F# Power Pack Linq Issue

我有一个简单的函数,该函数利用F#power pack将引号转换为linq表达式。该函数是:

1
2
3
4
5
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)

我使用此函数创建由linq to sql查询数据库的C#库使用的表达式。例如,我可以构建一个表达式,例如:

1
    let test = toLinq (<@fun u -> u.FirstName ="Bob"@> : Expr<Account->bool>)

并将其传递给类似这样的方法:

1
2
3
4
5
6
7
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版中的规定进行工作。但是,它在最新版本的Power Pack中不再起作用。我收到的错误是方法'Boolean GenericEqualityIntrinsic [String](System.String,System.String)'没有支持的SQL转换。

我看了看对Power Pack的更改,看来使用新版本构建的linq表达式利用GenericEqualityIntrinsic将属性的值与常量进行比较,而在1.9.9.9版本中,它使用了String.op_Equality进行比较。

这是对问题的正确理解吗?如何使用新版本的Power Pack将报价转换为linq表达式,而linq表达式可以由使用linq到sql的c#库使用?


您可以尝试以下报价:

1
<@fun u -> u.FirstName.Equals("Bob")@>


是否明确调用

1
System.String.op_Equality(s1,s2)

工作吗?