F#Power Pack Linq问题

时间:2011-06-22 04:03:13

标签: linq f# powerpack

我有一个简单的功能,它利用F#power pack将报价转换为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的设计工作的。但它不再适用于最新版本的电源组。我收到的错误是方法'布尔值GenericEqualityIntrinsic [String](System.String,System.String)'没有支持的SQL转换。

我看了一下power pack的变化,似乎使用新版本构建的linq表达式使用GenericEqualityIntrinsic来比较属性的值和常量,而在版本1.9.9.9中它使用了String.op_Equality用于比较。

这是对这个问题的正确理解吗?如何使用新版本的power pack将引用转换为linq表达式,这些表达式可以由使用linq to sql的c#库使用?

2 个答案:

答案 0 :(得分:2)

明确调用

System.String.op_Equality(s1,s2)

工作?

答案 1 :(得分:2)

您可以尝试引用:

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