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) |
工作吗?