2016-11-21 111 views
0

我收到此错误:无法投类型的对象JoinIterator

Unable to cast object of type 'd__37'4[System.Xml.Linq.XElement,BankOfBIT.Models.BankAccount,System.Int64,<>f__AnonymousType2'1[System.Xml.Linq.XElement]]' to type 'System.Collections.Generic.IEnumerable`1[System.Xml.Linq.XElement]'.

我想执行这个拉姆达查询:

IEnumerable<XElement> transactionsWithMatchingAccountNumber 
= (IEnumerable<XElement>) transactionswithValidAmount.Join(
    db.BankAccounts, 
    transactions => long.Parse(transactions.Element("account_no").Value), 
    accounts => accounts.AccountNumber, 
    (transactions, accounts) => new { XElement = transactions }); 

我想只得到相匹配的所有XML事务用数据库中的帐号验证它们是否存在。

我有一个包含这些元素的IEnumerable<XElement>

<transaction> 
    <institution>34439</institution> 
    <account_no>10000</account_no> 
    <type>2</type> 
    <amount>50</amount> 
    <notes>withdrawal</notes> 
</transaction> 

我有2分的EntityFramework MVC中的类这些模式:

public class Transaction 
{ 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int TransactionId { get; set; } 

    public long TransactionNumber { get; set; } 

    [ForeignKey("BankAccount")] 
    [Required] 
    public int BankAccountId { get; set; } 

    [ForeignKey("TransactionType")] 
    [Required] 
    public int TransactionTypeId { get; set; } 

    public double Deposit { get; set; } 

    public double Withdrawal { get; set; } 

    [Required] 
    public DateTime DateCreated { get; set; } 

    public string Notes { get; set; } 
    /// <summary> 
    /// create account with default next num 
    /// </summary> 
    public void SetNextTransactionNumber() 
    { 
     this.TransactionNumber = (long) StoredProcedures.NextNumber("NextTransactionNumbers"); 
    } 

    public virtual BankAccount BankAccount { get; set; } 

    public virtual TransactionType TransactionType { get; set; } 
} 

public abstract class BankAccount 
{ 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int BankAccountId { get; set; } 

    [Display(Name="Account\nNumber")] 
    public long AccountNumber { get; set; } 

    [Required] 
    [ForeignKey("Client")] 
    public int ClientId { get; set; } 

    [Required] 
    [ForeignKey("AccountState")] 
    public int AccountStateId { get; set; } 

    [Required] 
    [Display(Name = "Current\nBalance")] 
    [DisplayFormat(DataFormatString="{0:c2}")] 
    public double Balance { get; set; } 

    [Required] 
    [Display(Name = "Opening\nBalance")] 
    [DisplayFormat(DataFormatString = "{0:c2}")] 
    public double OpeningBalance { get; set; } 

    [Required] 
    [Display(Name = "Date\nCreated")] 
    [DisplayFormat(DataFormatString = "{0:d}")] 
    public DateTime DateCreated { get; set; } 


    [Display(Name = "Account\nNotes")] 
    public string Notes { get; set; } 

    /// <summary> 
    /// Returns the name of the account type 
    /// </summary> 
    [Display(Name = "Account\nType")] 
    public string Description 
    { 
     get 
     { 
      return GetType().Name.Split('_')[0].Replace("Account",""); 
     } 
    } 

    /// <summary> 
    /// Stores the bank account state 
    /// </summary> 
    public virtual AccountState AccountState { get; set; } 

    /// <summary> 
    /// Stores the client associated with the bank account 
    /// </summary> 
    public virtual Client Client { get; set; } 

    /// <summary> 
    /// Increments the account number static counter 
    /// </summary> 
    public abstract void SetNextAccountNumber(); 

    /// <summary> 
    /// Changes the state of the bank account 
    /// </summary> 
    public void ChangeState() 
    { 
     BankOfBITContext db = new BankOfBITContext(); 

     AccountState lastState; 
     AccountState futureState; 

     do{ 

      lastState = db.AccountStates.Find(AccountStateId); 

      lastState.StateChangeCheck(this); 

      futureState = db.AccountStates.Find(AccountStateId); 

     }while(lastState != futureState); 
    } 
} 

回答

0

尝试类似如下:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication28 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = 
       "<Root>" + 
        "<transaction>" + 
         "<institution>34439</institution>" + 
         "<account_no>10000</account_no>" + 
         "<type>2</type>" + 
         "<amount>50</amount>" + 
         "<notes>withdrawal</notes>" + 
        "</transaction>" + 
        "<transaction>" + 
         "<institution>34440</institution>" + 
         "<account_no>10001</account_no>" + 
         "<type>2</type>" + 
         "<amount>50</amount>" + 
         "<notes>withdrawal</notes>" + 
        "</transaction>" + 
       "</Root>"; 

      XDocument doc = XDocument.Parse(xml); 

      List<XElement> tranactions = doc.Descendants("transaction").ToList(); 

      var results = tranactions.Where(x => (int)x.Element("account_no") == 10000).Any(); 


     } 
    } 
} 
+0

我比较帐号而不是机构号码 – Ben

+0

固定代码。基本上和原来一样 – jdweng

相关问题