0

コードは次のとおりです。

list = query.Where(x => ((string)x.GetType()
    .GetProperty(propertyName).GetValue(this, null))
        .EndsWith(filterValue)).ToList();

このコードはリファクタリングされたコードであり、オブジェクトとプロパティレベルに分割すると、コードプロジェクト全体で100回繰り返す必要があります。このサイトでの私の調査によると、それはSQL変換と関係があります。しかし、このコードまたはそのバリアントが正常に機能する回避策はありますか?

4

1 に答える 1

3

解決策は、指定されたプロパティを返す Expression を作成し、その式を に渡すことWhereです。

var query = session.Query<YourType>();
list = query.Where(GetExpression<YourType>(propertyName, filterValue)).ToList();

GetExpression次のようになります。

public static Expression<Func<T, bool>> GetExpression<T>(string propertyName,
                                                  string filterValue)
{
    var parameter = Expression.Parameter(typeof(T));
    var property = Expression.Property(parameter, propertyName);
    var method = typeof(string).GetMethod("EndsWith", new [] { typeof(string) });
    var body = Expression.Call(property, method,
                               Expression.Constant(filterValue));
    return (Expression<Func<T, bool>>)Expression.Lambda(body, parameter);
}
于 2013-02-19T11:53:47.907 に答える