【发布时间】: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 是的,对于其他类型的交易行,我将有不同的字段来订购。