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)

この関数を使用して、linq to sql を使用してデータベースにクエリを実行する C# ライブラリによって使用される式を作成します。たとえば、次のような式を作成できます。

    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)' has no supported translation to SQL. です。

パワーパックの変更点を調べたところ、新しいバージョンを使用して構築された linq 式は、プロパティの値を定数と比較するために GenericEqualityIntrinsic を使用しているようですが、バージョン 1.9.9.9 では String を使用していました。比較のための op_Equality。

これは問題の正しい理解ですか?新しいバージョンのパワー パックを使用して、引用符を linq 式に変換し、linq を 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 に答える