如何扩展现有的 KeySelector

How to extend existing KeySelector

public class Address 
{
    public string City { get; set; }
    public string Street { get; set; }
}

public class User 
{
    public Address Address1 { get; set; }
    public Address Address2 { get; set; }
}

public class DefaultAddressSortingSpecification<TEntity>
{
    private readonly Expression<Func<TEntity, Address>> _keySelector;

    public DefaultAddressSortingSpecification(Expression<Func<TEntity, Address>> keySelector)
    {
        _keySelector = keySelector;
    }

    public IQueryable<TEntity> OrderingEntitiesFrom(IQueryable<TEntity> query)
    {
        //order by city
        //order by street
    }
}

usage: 

var s1 = new DefaultAddressSortingSpecification<User>(user => user.Address1);
var s2 = new DefaultAddressSortingSpecification<User>(user => user.Address2);

我想要通用的 AddressSortingSpecification。 _keySelector 指向地址实体。如何添加城市或街道?

一般我会这样写:user.Address1.City

据我了解这个问题,您想知道如何创建表达式来访问 AddressCityStreet 属性,当给定一个仅引用 Address。以下是我的做法:

public IQueryable<TEntity> OrderingEntitiesFrom(IQueryable<TEntity> query)
{
    var parameter = _keySelector.Parameters.Single();

    var address = _keySelector.Body;

    var citySelector = Expression.Lambda<Func<TEntity, string>>(Expression.Property(address, "City"), parameter);
    var streetSelector = Expression.Lambda<Func<TEntity, string>>(Expression.Property(address, "Street"), parameter);

    return query.OrderBy(citySelector).ThenBy(streetSelector);
}