根据作为集合的子类排序列表

时间:2020-10-27 12:53:52

标签: c# .net entity-framework

如何根据其子类(集合)的属性对类进行排序?我正在做一个产品和出价项目,其中有些产品没有出价,有些产品会有出价。 这是我一直在尝试的方法,但问题是它给了我一个“至少一个对象必须实现IComparable”异常。

编辑

目标是根据出价最高或最低的产品对产品进行排序。

升序排序示例

|---------------------|------------------|
|      Product        |  Most Recent Bid |
|---------------------|------------------|
|          1          |         $100     |
|---------------------|------------------|
|---------------------|------------------|
|          2          |         $150     |
|---------------------|------------------|
|---------------------|------------------|
|          3          |         $175     |
|---------------------|------------------|

我的解决方案

productList = Sort == true ?
productList.OrderBy(x => x.Bids.OrderByDescending(y => y.BidAmount)) :
productList.OrderBy(x => x.Bids.OrderBy(y => y.BidAmount));

产品类别

public class Product
    {
        [Key]
        public Guid ProductId { get; set; }
        [MaxLength(30)]
        public string ProductName { get; set; }
        [MaxLength(200)]
        [Required]
        public string ProductDescription { get; set; }
        [Required]
        public string ImgUrl { get; set; }
        [Required]
        public DateTime ExpiryDate { get; set; }

        [Required]
        public DateTime UploadDate { get; set; }
        public ICollection<Bid> Bids { get; set; }
    }

出价类别

public class Bid
    {
        [Key]
        public Guid BidId { get; set; }
        [Required]
        public decimal BidAmount { get; set; }
        [Required]
        public DateTime BidDate { get; set; }
        [Required]
        [ForeignKey("Product")]
        public Guid ProductId { get; set; }
        public Product Product { get; set; }
        [Required]
        [ForeignKey("User")]
        public Guid UserId { get; set; }
        public User User { get; set; }
    }

我尝试使用thisthis的解决方案,但没有一个涵盖集合属性用例。

1 个答案:

答案 0 :(得分:0)

按金额排序出价不会引发该错误。问题是x.Bids.OrderBy(...)返回了一个出价列表,因此您试图根据出价列表订购产品。由于无法将通用列表与另一个列表进行比较,因此您需要更加具体。

如果您想根据投标数量订购产品,可以使用此

productList.OrderBy(x => x.Bids.Count());

或者,如果您想根据出价总额订购产品,可以使用

productList.OrderBy(x => x.Bids.Sum(b => b.BidAmount));