Кастинг коллекций в WinForms - PullRequest
0 голосов
/ 07 ноября 2011

Я перебираю свой XML-файл, чтобы получить список депозитов и передать их на мой уровень бизнес-логики в виде списка.Я получаю сообщение об ошибке, в котором говорится, что коллекция анонимных типов не содержит определения для to.list.Если я пропускаю to.list из оператора return, я получаю сообщение об ошибке select, в котором говорится, что мне не хватает приведения, поскольку он не может преобразовать анонимную коллекцию в список.Как я могу решить эту проблему?

Уровень доступа к данным

public class DepositList
{
    public string Depid { get; set; }
    public string Amount { get; set; }
    public string DepDate { get; set; }
}

public class DLDeposits
{
    public List<DepositList> getDeposits(string customerid)
    {

        double sumDep = 0;
        //Returns list of deposits for selected customer
        var doc = XDocument.Load("Portfolio.xml");

        List<DepositList> result = from account in doc.Descendants("account")
                       from deposit in account.Elements("deposits")
                       where (string)account.Element("acct").Attribute("custid").Value == customerid
                       select new
                       {
                           Depid = (string)deposit.Attribute("depid").Value,
                           Amount = (string)deposit.Attribute("depamount").Value,
                           DepDate = (string)deposit.Attribute("depdate").Value
                       }.ToList();

        return result;
    }
}

Уровень бизнес-логики

    public double  getDeposits(string customerId)
    {
        double sumDep = 0;
        //Returns list of deposits for selected customer
        var doc = XDocument.Load("Portfolio.xml");
        CustCount(doc);

        DLDeposits obj = new DLDeposits();
        var depositList = obj.getDeposits(customerId);

                        for (int i = 0; i < NumCusts; i++)
                        {
                            BL_Deposit oDeposit = new BL_Deposit();
                            oDeposit.DepAmt = Convert.ToDouble(depositList[i].Amount);
                            oDeposit.DepDate = Convert.ToDateTime(depositList[i].DepDate);
                            oDeposit.DepositId = Convert.ToInt32(depositList[i].Depid);
                            addDeposits(oDeposit);
                            sumDep += oDeposit.DepAmt;
                        }
                        return sumDep;
        }

1 Ответ

4 голосов
/ 07 ноября 2011

Проблема в том, что вы создаете новый список анонимного типа, а не List<DepositList>. Вам просто нужно изменить ваше предложение select на:

select new DepositList
{
    Depid = (string) deposit.Attribute("depid"),
    Amount = (string) deposit.Attribute("depamount"),
    DepDate = (string) deposit.Attribute("depdate")
}

Обратите внимание, что я удалил использование свойства Value - вам не нужно было ни , ни приведение к строке, ни использование явного преобразования из XAttribute в string вы получите null вместо NullReferenceException, если атрибут отсутствует.

Однако, мне кажется, что было бы лучше, если бы DepositList было напечатано более строго, например:

public class DepositList
{
    public int Depid { get; set; }
    public decimal Amount { get; set; }
    public DateTime DepDate { get; set; }
}

Тогда вы можете использовать:

select new DepositList
{
    Depid = (int) deposit.Attribute("depid"),
    Amount = (decimal) deposit.Attribute("depamount"),
    DepDate = (DateTime) deposit.Attribute("depdate")
}

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

Обратите внимание, что я сделал Amount a decimal вместо double. Вы должны не использовать double для финансовых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...