今日、文字列プロパティ名に基づいてラムダ式を返すメソッドがあります。つまり、「説明」を渡すと、d => d.Description のラムダが返されます。これはうまく機能しますが、ドット表記を含む文字列を指定してラムダ式を返す必要があります。つまり、「Customer.Name」を渡して、d => d.Customer.Name のラムダ式を取得したいと考えています。以下は、1レベルのラムダを返すメソッドを既に作成していますが、マルチレベルに変更する方法がわかりません。
protected dynamic CreateOrderByExpression(string sortColumn)
{
var type = typeof (TEntity);
Type entityType = null;
if (type.IsInterface)
{
var propertyInfos = new List<PropertyInfo>();
var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
var subType = queue.Dequeue();
foreach (var subInterface in subType.GetInterfaces().Where(subInterface => !considered.Contains(subInterface)))
{
considered.Add(subInterface);
queue.Enqueue(subInterface);
}
var typeProperties = subType.GetProperties(
BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance);
var newPropertyInfos = typeProperties
.Where(x => !propertyInfos.Contains(x));
propertyInfos.InsertRange(0, newPropertyInfos);
if (propertyInfos.All(f => f.Name != sortColumn)) continue;
entityType = subType;
break;
}
}
if (entityType == null)
{
return null;
}
var parameter = Expression.Parameter(typeof (TEntity));
var memberExpression = Expression.Property(parameter, entityType, sortColumn);
var lambdaExpression = Expression.Lambda(memberExpression, parameter);
return lambdaExpression;
}