微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用动态linq按表达式“前缀”顺序

如何解决如何使用动态linq按表达式“前缀”顺序

所以我有这样一个场景,我需要将 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 中的 nestedProp,这将需要在我无法完全控制的源中进行太多重构,只是为了让订单立即生效。

示例:

var listofParents = GetParentsOrdered("nested.Title DESC");

问题是,有没有办法告诉 Dynamic Linq 在表达式前加上 nestedProp 前缀,这样我就可以通过直接在表达式上提供孩子的属性并将排序直接传递给 nestedProp 来进行排序{1}}?

像这样:

query.OrderByPrefixed("nestedProp","Title DESC,CreatedAt DESC");

解决方法

这是一些使用反射自动为嵌套属性名称添加前缀的代码。可以进行扩展以自动提取(多个)嵌套属性。此代码假定 ParentNested 之间的属性名称没有重叠。

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.$&"));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。