首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用dynamic-linq“前缀”order by表达式

如何使用dynamic-linq“前缀”order by表达式
EN

Stack Overflow用户
提问于 2021-02-16 00:52:59
回答 1查看 40关注 0票数 0

所以我有这样一个场景,我需要将OrderBy表达式“传递”到嵌套属性中,但我不能简单地更改表达式,因为它在太多地方使用,而不考虑嵌套属性。

例如,我有这两个类,它们用于生成IQueryable<Parent>,并使用.OrderBy("Title DESC")等来应用订单。但是,"Title DESC"表达式是由外部世界提供的,这使得重构非常困难。

代码语言:javascript
复制
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 */
}

我通过这样的方法恢复它:

代码语言:javascript
复制
public IQueryable<Parent> GetParentsOrdered(stirng order){
    IQueryable<Parent> query = QueryParents();
    
    return query.OrderBy(order);
}

用法是这样的:

代码语言:javascript
复制
var listOfParents = GetParentsOrdered("Title DESC");

问题是,为了让它正常工作,我必须考虑order by表达式上的NestedProp,这将需要在我不完全控制的源中进行太多的重构,只是为了让排序立即生效。

示例:

代码语言:javascript
复制
var listOfParents = GetParentsOrdered("Nested.Title DESC");

问题是,有没有什么方法可以告诉Dynamic Linq在表达式前面加上NestedProp,这样我就可以通过直接在表达式上提供孩子的属性并将排序直接传递给NestedProp来进行排序

如下所示:

代码语言:javascript
复制
query.OrderByPrefixed("NestedProp", "Title DESC, CreatedAt DESC");
EN

回答 1

Stack Overflow用户

发布于 2021-02-16 04:58:01

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

代码语言:javascript
复制
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.$&"));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66212123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档