public Sale GetSale() { if (allOperations.Count == 0) { KeyValuePair <int, OperationType> [] operations; if (operationType == (int)Data.OperationType.Sale) { operations = GetOperationsByIssuedNumber(Number); } else if (operationType == (int)Data.OperationType.Purchase) { operations = GetOperationsByReceivedNumber(Number); } else { return(null); } allOperations.AddRange(operations.Select(o => Operation.GetById(o.Value, o.Key))); } Operation last = allOperations.LastOrDefault(); Sale lastSale = last as Sale; Purchase lastPurchase = last as Purchase; Sale ret; if (lastSale != null) { ret = lastSale.CloneOperationBody <Sale> (); } else if (lastPurchase != null) { ret = lastPurchase.CloneOperationBody <Sale> (); } else { return(null); } List <SaleDetail> details = new List <SaleDetail> (); foreach (var oper in allOperations) { Sale s = oper as Sale; if (s != null) { if (s.Details.Count == 0) { s.LoadDetails(); } details.AddRange(s.Details); continue; } Purchase p = oper as Purchase; if (p != null) { if (p.Details.Count == 0) { p.LoadDetails(); } details.AddRange(p.Details.Select(pd => pd.Clone <SaleDetail> ())); } } ret.Details.Clear(); ret.Details.AddRange(details); return(ret); }