0

これに関連する投稿がたくさんあることを認識しており、広範囲に調査しましたが、これを理解できないようです. とてもシンプルなはずです。動的な列名で列ドメインを生成するだけです。何かのようなもの

public IEnumerable<ColumnEntity> GetColumnDomain(string column)
{   List<ColumnEntity> columnEntities = new List<ColumnEntity>();
    var query = db.CITATIONs.Select(m => m."column").Distinct();
    ....
}

ここで、「列」は動的パラメーター値です。クエリ式を動的に生成するための式ツリーの構築を開始しました

ParameterExpression pe = Expression.Parameter(typeof(CITATION), "c");
Expression theColumn = Expression.Property(pe, typeof(string).GetProperty(column));

しかし、それはそれについてです。前もって感謝します

4

2 に答える 2

0

だから、あなたが何を求めているのか完全にはわかりません。しかし、簡単に言えば:

public PropertyInfo GetPropertyInfo<T>(Expression<Func<T, Object>> expression)
{
    MemberExpression memberData = (MemberExpression)expression.Body;
    return (PropertyInfo)memberData.Member;
}

これだけでメンバーに関するプロパティ情報が得られるので、次の場合は次のようになります。

PropertyInfo info = GetPropertyInfo<FileInfo>(file => file.FullName);
Console.WriteLine(info.Name);

式に入力したプロパティに対応する「FullName」が表示されます。

于 2013-02-06T20:20:12.493 に答える
0

メソッドを使用しExpression.PropertyOrField()てメンバー アクセスを生成します。また、列のタイプも知っておく必要があります。そうしないと、機能しません。

これはすべて、次の汎用メソッドに一般化できます。

public static Expression<Func<TSource, TResult>>
    GenerateSelector<TSource, TResult>(string propertyOrFieldName)
{
    var parameter = Expression.Parameter(typeof(TSource));
    var body = Expression.Convert(
        // generate the appropriate member access
        Expression.PropertyOrField(parameter, propertyOrFieldName),
        typeof(TResult)
    );
    var expr = Expression.Lambda<Func<TSource, TResult>>(body, parameter);
    return expr;
}

次に、次のようにします。

public IEnumerable<ColumnEntity> GetColumnDomain<TColumn>(string column)
{
    var query = db.CITATIONs
        .Select(GenerateSelector<CITATION, TColumn>(column))
        .Distinct();
    // ...
}
于 2013-02-06T20:14:55.487 に答える