1

以下の式ビルダーは正常に動作します。subMember文字列であれば問題ありません。

subMember名前付きのを受け取ったと想像してください。CodeこれCodeInt32です。これについては、を作成したいのですが、であるStartWithため解析できませんInt32。文字列に変換する必要があると思います。どうすればそれを実装できますか?

例:100、102、105、200、300、301、3011..。

subMember = "10"の場合、結果は100,102,105になります。

subMember = "30"の場合、結果は300,301,3011になります。

subMember = "301"の場合、結果は301,3011になります

private static Expression<Func<T, bool>> BuildPredicate<T>(string member, object value)
{
    var p = Expression.Parameter(typeof(T));
    Expression body = p;
    foreach (var subMember in member.Split('.'))
    {
        body = Expression.PropertyOrField(body, subMember);
    }
    return Expression.Lambda<Func<T, bool>>(
        Expression.Equal(body, Expression.Constant(value, body.Type)), p);
}
4

1 に答える 1

1

文字列に対してのみ本当に意味があるのでStartsWith、私が最初にすることは、を使用して物事を単純化することstring valueです。foreachこれで、メンバーを解決するためのループの後で、次のタイプを確認できbodyます。

if(body.Type != typeof(string)) body = Expression.Call(body, "ToString", null);

次に、:を適用しStartsWithます

body = Expression.Call(body, "StartsWith", null, Expression.Constant(value));

次にラムダを作成します。

return Expression.Lambda<Func<T, bool>>(body, p);

でも!これがLINQ-to-EF/LINQ-to-SQLの場合、次のような構文をサポートするライブラリに依存します。

.Where(x => x.Foo.Bar.ToString().StartsWith("1"))

それが構築されているものだからです。また、これがどのデータベースインデックスでもうまく機能するとは思いません。テキストで始まる整数を検索すること"1"は、明白なインデックス操作ではありません。最後に、負の数などに注意してください。-1で「開始」しません"1"

于 2013-03-19T12:23:58.973 に答える