我有一个简单的函数,它利用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 GenericEqualityIntristic[String](System.String,System.String)"不支持转换为SQL
我看了一下电源组的变化,使用新版本构建的linq表达式似乎使用了GenericEqualityIntrinsic来比较属性的值和常量,而在1.9.9.9版本中,它使用了String.op_Equality进行比较。
这是对这个问题的正确理解吗?我如何利用新版本的电源包将引号转换为linq表达式,这些表达式可以由使用linq到sql的c#库使用?
是否显式调用
System.String.op_Equality(s1,s2)
工作?
您可以尝试以下报价:
<@fun u -> u.FirstName.Equals("Bob")@>