次のエンティティ構造があります。Invoice.InvoiceLines を設定するいくつかのデコレータがあり、最後に OrderReference でこれらのインボイスラインを注文したい
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を使用してそれを行う方法はありますか。
次の方法でなんとかできました
invoiceLines.OrderBy(Func1)
//.ThenBy(Func2).
//ThenBy(Func3).
ToList();
private static string Func1(InvoiceLine invoiceLine) =>
invoiceLine.TransactionLines.OfType<PermanentPlacementTransactionLine >().First()
.OrderReference ;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加