【问题标题】:Order by collection using linq by fields at deep level class/entity在深层类/实体中使用 linq 按字段按集合排序
【发布时间】:2017-08-07 15:11:40
【问题描述】:

我有以下实体结构。我有几个装饰器将填充 Invoice.InvoiceLines,最后我想通过 OrderReference 订购这些 invoicelines

 public class Invoice 
    {
        private readonly IList<InvoiceLine> _invoiceLines;
        public virtual IList<InvoiceLine> InvoiceLines => _invoiceLines;

        public Invoice()
        {
            _invoiceLines = new List<InvoiceLine>();
        }

    }

    public class InvoiceLine 
    {

        private readonly IList<TransactionLine> _transactionLines = new List<TransactionLine>();
        public virtual IReadOnlyCollection<TransactionLine> TransactionLines => new ReadOnlyCollection<TransactionLine>(_transactionLines);

        public virtual void AddTransactionLine(TransactionLine transactionLine)
        {
            transactionLine.ThrowIfNull(nameof(transactionLine), "can't be null");
            _transactionLines.Add(transactionLine);
        }
    }


    public class PermanentPlacementTransactionLine : TransactionLine
    {

        public PermanentPlacement PermanentPlacement { get; set; }
    }


      public  class PermanentPlacement 
    {
        public virtual string JobReference { get; set; }
        public virtual string OrderReference { get; set; }
    }

我想做的是按 OrderReference 订购发票行。

  foreach (var invoice in DecoratedResult.Invoices.Where(inv => inv.InvoiceType == InvoiceType.Weekly))
            {
                var customer = CustomerRepository.FetchByAccountNumber(invoice.CustomerAccountNumber);
                if (customer.InvoiceProperties.InvoiceSequence == InvoiceSequence.OrderReference)
                {
                   // order by fields at deep level.
                   // invoice.InvoiceLines.OrderBy(i => i.TransactionLines.OfType<PermanentPlacementTransactionLine>());
                }
            }

我可以向 invoiceline 公开属性,然后进行相应设置,但有什么方法可以使用 linq 来做到这一点。

【问题讨论】:

  • 看看code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b,你会发现OrderBy方法。
  • 问题是每当您将新项目添加到您的列表中时,您都希望它们结束,因此列表停止排序?如果是这样,您可能对SortedList (msdn.microsoft.com/en-us/library/…) 感兴趣。否则我有点不确定你的问题到底出在哪里。
  • 我注意到看起来只有一些TransactionLine 对象(PermanentPlacementTransactionLine 类型的对象)上有 OrderReference。你想用其他类型的 TransactionLine 做什么?你需要更好地指定这个......
  • 所以要明确一点,您只想排序 invoice.InvoiceLines 而不是 DecoratedResult.Invoices,对吗?
  • @Chris 是的,对于其他类型的交易行,我将有不同的字段来订购。

标签: c# linq


【解决方案1】:

我设法做到了以下方式

     invoiceLines.OrderBy(Func1)
     //.ThenBy(Func2).
     //ThenBy(Func3).
     ToList();

private static string Func1(InvoiceLine invoiceLine) =>
            invoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine >().First()
                .OrderReference ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2020-07-19
    • 2018-01-25
    相关资源
    最近更新 更多