如何扩展现有的 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
据我了解这个问题,您想知道如何创建表达式来访问 Address
的 City
和 Street
属性,当给定一个仅引用 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);
}
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
据我了解这个问题,您想知道如何创建表达式来访问 Address
的 City
和 Street
属性,当给定一个仅引用 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);
}