OrderBy 将 Dynamic Linq 与 Relation 结合使用

Posted

技术标签:

【中文标题】OrderBy 将 Dynamic Linq 与 Relation 结合使用【英文标题】:OrderBy using Dynamic Linq with Relation 【发布时间】:2017-04-26 03:05:47 【问题描述】:

我正在尝试按相关对象的属性进行排序。只是一个例子,情况就是这样。我有这两个类:

public class Publication

    public int Id  get; set; 
    public string Name  get; set; 
    public List<Product> Products  get; set; 


public class Product

    public int Id  get; set; 
    public string Name  get; set; 
    public int PublicationId  get; set; 
    [ForeignKey("PublicationId")]
    public Publication Publication  get; set; 
    public int Category  get;set; 

现在我需要获取 Product's Category = 1 并按 Publication Id desc 排序的所有出版物:

IQueryable<Publication> query = db.Publications.Where("Products.Any(Category = 1)");
List<Publication> list = query.OrderBy("Id desc").ToList();

这很好用!但是...如何使用 Dynamic Linq 按产品类别(desc 或 asc)订购出版物?

【问题讨论】:

你不能只做 OderByDescending 吗? (msdn.microsoft.com/en-us/library/bb534861(v=vs.110).aspx) 顺序(asc 或 desc)现在不是问题。问题是关于如何按关系排序(按升序或降序)。在这种情况下,类别(来自产品) Publication 有一个或多个产品,因此也有类别。您首先应该定义如何对类别集合进行排序。 一个出版物有一个或多个产品。 Category 只是 Product 中的一个整数。我只需要根据产品类别的数量对 PUBLICATIONS 进行排序。 相关? ***.com/questions/6617596/… 【参考方案1】:

我还没有找到使用System.Linq.Dynamic 的方法,但Linq 可以使用

var query = publications.OrderByDescending(p => p.Products.Select(x => x.Category).FirstOrDefault()).ToList();

这里是测试类:

var publications = new List<Publication>
        
            new Publication
            
                Products = new List<Product>
                
                    new Product Category = 5,
                    new Product Category = 6,
                    new Product Category = 7
                
            ,
            new Publication
            
                Products = new List<Product>
                
                    new Product Category = 2,
                    new Product Category = 3,
                    new Product Category = 4
                
            ,
            new Publication
            
                Products = new List<Product>
                
                    new Product Category = 8,
                    new Product Category = 9,
                    new Product Category = 10
                
            
        ;

        var query = publications.OrderByDescending(p => p.Products.Select(x => x.Category).FirstOrDefault()).ToList();

        query.ForEach(x => Console.WriteLine(x.ToString()));

输出是:

8 , 9 , 10
5 , 6 , 7
2 , 3 , 4

如您所见,它并没有在内部订购 Products

【讨论】:

谢谢,但我在 Dynamic Linq 中需要这个。 好的,我会注意的,你的订单标准是什么?,但是出于好奇,如果你可以使用“普通”的,为什么选择 Dynamic Linq? 那是因为我正在 webapi 中从 url 构建字符串查询。这都是动态生成的。一切正常。我只需要这个来完成项目。你的订单没问题。出版物根据嵌套的产品类别按升序或降序排序。 我做的方式是按找到的第一个产品的类别排序,如果没有则取0,这是你的标准吗? 我觉得还可以

以上是关于OrderBy 将 Dynamic Linq 与 Relation 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Entities OrderBy 表达式树

如何使用 System.Linq.Dynamic 检查 JSON 对象是不是与谓词匹配

Linq Orderby 与自身进行比较。为啥?

将 orderby 应用于 C# LINQ 内连接

C# linq 多表关联

EF6 Dynamic Linq 将字符串转换为十进制