2011-11-06 66 views
0

我正在循環訪問我的XML文件以捕獲存款清單並將它們作爲列表傳遞給我的業務邏輯層。我在退貨聲明中收到一條錯誤消息,說匿名類型集合不包含to.list的定義。如果我將to.list從退貨聲明中刪除,我在select上發現錯誤,說我錯過了演員陣容,因爲它無法將匿名收藏轉換爲列表。我該如何解決這個問題?在WinForms中投射集合

數據訪問層

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; 
     } 

回答

4

的問題是,你正在創建一個匿名類型,而不是一個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將盡轉換爲你。 (在這種情況下,它會拋出一個異常,如果任何屬性丟失,因爲我使用非空值類型。)

請注意,我做了一個Amount,而不是decimal一個double的。您應該使用而不是使用double獲取財務價值。