2

我有一个简单的函数,它利用 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 版中的设计工作的。但是,它不再适用于最新版本的电源组。我收到的错误是Method 'Boolean GenericEqualityIntrinsic[String](System.String, System.String)' 没有支持的 SQL 转换。

我查看了电源组的更改,似乎使用新版本构建的 linq 表达式使用 GenericEqualityIntrinsic 将属性值与常量进行比较,而在版本 1.9.9.9 中它使用了字符串。 op_Equality 用于比较。

这是对问题的正确理解吗?如何利用新版本的电源包将引用转换为 linq 表达式,以便使用 linq to sql 的 ac# 库使用?

4

2 回答 2

2

是否显式调用

System.String.op_Equality(s1,s2)

工作?

于 2011-06-22T05:17:05.377 回答
2

您可以尝试以下报价:

<@fun u -> u.FirstName.Equals("Bob")@>
于 2011-06-22T08:12:45.253 回答