Определения, какие счета должны быть зачислены/списаны


Я недавно обнаружил/наткнулся и пытаюсь выучить и использовать свои возможности. Вот моя первая функция UpdateTransactionsData(). Этот метод предназначен для PurchaseDocument класс, который я включил частично. В основном эта функция перебирает выбранные элементы на PurchaseDocument, и работы, которые счетов (план счетов, согласно бухгалтерского учета) должны быть зачислены/списаны на каждый приобретенный товар.

После того как я заполнен свойства словарь с суммы сделки, я использовать LINQ, чтобы сначала удалить все транзакции с суммой 0, а затем генерировать XML-элементы, представляющие операции (при условии, пример выходных данных).

Код работает. Использую ли я право на LINQ? Оптимальный код? Я могу улучшить код в LINQ? Я должен даже использовать его?

XmlOutput

<Debit Account="26" Amount="36" />
<Debit Account="24" Amount="188.7" />
<Debit Account="80" Amount="-29.21" />
<Credit Account="57" Amount="253.91" />
<Inventory Item="22007" Adjustment="10" />
<Inventory Item="11389" Adjustment="5" />

PurchaseDocument.в CS

public class PurchaseDocument
{
    public Dictionary<int, double> DebitTransactions = new Dictionary<int, double>();
    public Dictionary<int, double> CreditTransactions = new Dictionary<int, double>();
    public Dictionary<int, double> InventoryTransactions = new Dictionary<int, double>();

    #region public ObservableCollection<PurchaseDocumentItem> Items;
    private ObservableCollection<PurchaseDocumentItem> _Items = new ObservableCollection<PurchaseDocumentItem>();
    public ObservableCollection<PurchaseDocumentItem> Items
    {
        get { return _Items; }
        set
        {
            string property = "Items";
            OnPropertyChanging(property);
            _Items = value;
            OnPropertyChanged(property);
        }
    }
    #endregion

    private void UpdateTransactionsData()
    {
        DebitTransactions.Clear();
        CreditTransactions.Clear();
        InventoryTransactions.Clear();
        Entity.TransactionsData = "";

        foreach (PurchaseDocumentItem item in Items.Where(x => x.InventoryItem != null))
        {
            // asset and expense transactions
            int account = (item.InventoryItem.IsService) ? item.InventoryItem.CogsAccountID : item.InventoryItem.AssetAccountID;
            if(!DebitTransactions.ContainsKey(account))
                DebitTransactions.Add(account, 0);
            DebitTransactions[account] += item.Amount;

            // inventory transaction
            if (!item.InventoryItem.IsService)
            {
                if(!InventoryTransactions.ContainsKey(item.ItemID))
                    InventoryTransactions.Add(item.ItemID, 0);
                InventoryTransactions[item.ItemID] += item.Quantity;
            }
        }

        // tax transaction
        int taxaccount = Session.Company.PurchasesTaxAccountID;
        if(!DebitTransactions.ContainsKey(taxaccount))
            DebitTransactions.Add(taxaccount, 0);
        DebitTransactions[taxaccount] -= (double)Tax;

        // freight transaction
        int freightaccount = Session.Company.FreightExpenseAccountID;
        if(!DebitTransactions.ContainsKey(freightaccount))
            DebitTransactions.Add(freightaccount, 0);
        DebitTransactions[freightaccount] += (double)Freight;

        // payables transaction
        int payablesaccount = Session.Company.AccountsPayableID;
        if(!CreditTransactions.ContainsKey(payablesaccount))
            CreditTransactions.Add(payablesaccount, 0);
        CreditTransactions[payablesaccount] += (double)Total;

        // take out all transaction with amount 0
        DebitTransactions = DebitTransactions.Where(x => x.Value != 0).ToDictionary(x => x.Key, x => x.Value);
        CreditTransactions = CreditTransactions.Where(x => x.Value != 0).ToDictionary(x => x.Key, x => x.Value);
        InventoryTransactions = InventoryTransactions.Where(x => x.Value != 0).ToDictionary(x => x.Key, x => x.Value);

        // convert the data to xml
        Entity.TransactionsData += DebitTransactions.Aggregate("", (data, t) => data + "<Debit Account=\"" + t.Key.ToString()  + "\" Amount=\"" + t.Value.ToString() + "\" />" + Environment.NewLine);
        Entity.TransactionsData += CreditTransactions.Aggregate("", (data, t) => data + "<Credit Account=\"" + t.Key.ToString() + "\" Amount=\"" + t.Value.ToString() + "\" />" + Environment.NewLine);
        Entity.TransactionsData += InventoryTransactions.Aggregate("", (data, t) => data + "<Inventory Item=\"" + t.Key.ToString() + "\" Adjustment=\"" + t.Value.ToString() + "\" />" + Environment.NewLine);
    }
}


853
6
задан 24 августа 2011 в 06:08 Источник Поделиться
Комментарии
1 ответ

Я не вижу никакой проблемы с LINQ, которая у вас есть.

Если вы хотели, вы могли бы использовать немного LINQ, чтобы избавиться от того, что цикл foreach у вас есть. Вы можете создать два запроса LINQ для запроса к коллекции items, учетные записи групп/элементов вместе, и возвращает сумму сумм/количеств в качестве словаря:

DebitTransactions = (from item in Items
where item.InventoryItem != null

let account = (item.InventoryItem.IsService) ? item.InventoryItem.CogsAccountID : item.InventoryItem.AssetAccountID

group item by account into itemGroup
select new
{
Account = itemGroup.Key,
Amount = itemGroup.Sum(i => i.Amount)
}).ToDictionary(k => k.Account, v => v.Amount);

InventoryTransactions = (from item in Items
where item.InventoryItem != null && !item.InventoryItem.IsService

group item by item.ItemID into itemGroup
select new
{
ItemID = itemGroup.Key
Quantity = itemGroup.Sum(i => i.Quantity)
}).ToDictionary(k => k.ItemID, v => v.Quantity);

Это немного более сумбурно и, возможно, немного менее эффективные, но хорошо для обучения по LINQ.

2
ответ дан 24 августа 2011 в 07:08 Источник Поделиться