提问者:小点点

如何根据其子对象列表中的值对可查询的父对象列表进行排序


我试图根据特定规范TypeID的TextValue,按复杂对象的子列表对复杂对象的父列表进行排序。

我有以下类:

public class Product
{
    public long Id {get;set;}
    public string Name {get;set;}
    public List<Specification> Specifications {get;set;}
}

public class Specification
{
    public long Id {get;set;}
    public long TypeId {get;set;}
    public string TextValue {get;set;}
}

我想根据产品的具体规格对我的产品进行排序。 示例用例:在TypeId=3的规范的TextValue上对产品进行排序。 (一个产品只能有一个TypeId为3的规格)

我的产品列表是这样的:

IQueryable<Product> productQuery = _context.Products.Include("Specifications");

SortTypeId是我想要订购产品列表的规格类型。

这就是我试图做的:

productQuery = productQuery
.OrderBy(pq => pq.Specifications
.OrderBy(s => s.TypeID == SortTypeID ? Int32.MinValue : s.Id)
.ThenBy(v => v.TextValue));

这会出现以下例外情况:

System.ArgumentException: 'DbSortClause expressions must have a type that is order comparable.
Parameter name: key'

我还尝试用Indexof按sortedProductIds列表对IQueryable进行排序,但也没有起作用(Indexof不支持带惰性加载的IQueryable)。


共1个答案

匿名用户

既然您说一个产品只能有一个SortTypeID类型的规范,那么如果您在查询中加入该单一规范并按其排序会怎样呢?

下面是我建议使用查询语法的一些示例。

from p in _context.Products.Include("Specifications")
join orderSpec in _context.Specifications on new { ProductID = p.Id, TypeID = 3 }
                                    equals new { ProductID = orderSpec.ProductId, TypeID = orderSpec.TypeID }
orderby orderSpec.TextValue
select p

希望有帮助!