所以我有这样一个场景,我需要将OrderBy表达式“传递”到嵌套属性中,但我不能简单地更改表达式,因为它在太多地方使用,而不考虑嵌套属性。
例如,我有这两个类,它们用于生成IQueryable<Parent>,并使用.OrderBy("Title DESC")等来应用订单。但是,"Title DESC"表达式是由外部世界提供的,这使得重构非常困难。
class Parent {
public Nested NestedProp {get;set;}
/* other irrelevant props */
}
class Nested {
public string Id {get;set;}
public string Title {get;set;}
public DateTime CreatedAt {get;set;}
/* other irrelevant props */
}我通过这样的方法恢复它:
public IQueryable<Parent> GetParentsOrdered(stirng order){
IQueryable<Parent> query = QueryParents();
return query.OrderBy(order);
}用法是这样的:
var listOfParents = GetParentsOrdered("Title DESC");问题是,为了让它正常工作,我必须考虑order by表达式上的NestedProp,这将需要在我不完全控制的源中进行太多的重构,只是为了让排序立即生效。
示例:
var listOfParents = GetParentsOrdered("Nested.Title DESC");问题是,有没有什么方法可以告诉Dynamic Linq在表达式前面加上NestedProp,这样我就可以通过直接在表达式上提供孩子的属性并将排序直接传递给NestedProp来进行排序
如下所示:
query.OrderByPrefixed("NestedProp", "Title DESC, CreatedAt DESC");发布于 2021-02-16 04:58:01
下面是一些使用反射自动为嵌套属性名添加前缀的代码。可以进行扩展以自动提取(多个)嵌套属性。此代码假定Parent和Nested之间的属性名称没有重叠。
static List<string> NestedPropertyNames = typeof(Nested).GetProperties().Select(pi => pi.Name).ToList();
static Regex srcPattern = new Regex(@"(?<=\W|^)(?:"+String.Join("|", NestedPropertyNames)+@")(?=\W|$)", RegexOptions.Compiled);
public IQueryable<Parent> GetParentsOrdered(string order){
IQueryable<Parent> query = QueryParents();
return query.OrderBy(srcPattern.Replace(order, "NestedProp.$&"));
}https://stackoverflow.com/questions/66212123
复制相似问题