昨日、非常によく似た質問をしましたが、受け入れた回答がすべての問題を解決するとは限らないことに今日まで気づきませんでした。次のコードがあります。
public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName)
{
var param = Expression.Parameter(typeof(TItem), "item");
var field = Expression.Property(param, fieldName);
return Expression.Lambda<Func<TItem, object>>(field,
new ParameterExpression[] { param });
}
次のように使用されます。
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
これにより、 から主キーを引き出すことができますIQueryable<TUnknown>
。問題は、このコードが 1 つの主キーでしか機能せず、複数の PK のサポートを追加する必要があることです。
SelectExpression
では、上記のメソッドを適応させてIEnumerable<string>
(主キー プロパティ名のリスト) を取得し、それらのキーを選択する式をメソッドに返させる方法はありますか?
つまり、次のようになります。
var knownRuntimePrimaryKeys = new string[] { "CustomerId", "OrderId" }`
私の選択は、(実行時に)次のことを行う必要があります。
var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });