2011-01-19 8 views
2

У меня есть два DataTable s. У меня есть некоторые данные, которые были извлечены из XML-файла в Интернете в DataTable под названием rates. У меня также есть DataTable с набором finanical сделок, которые были извлечены из базы данных под названием openTrades с кодом, как это:Как присоединиться к DataTables?

DataTable rates = DB.GetCurrentFxPrices("http://rates.fxcm.com/RatesXML"); 
DataTable openTrades = DB.GetOpenTrades(); 

Я хочу, чтобы добавить столбец openTrades под названием rate и положить туда текущую скорость от ratesDataTable присоединение к колонке под названием symbol.

ставки DataTable имеет следующие столбцы:

Bid, Ask, High, Low, Direction, Last, Symbol

В openTrades DataTable имеет следующие соответствующие столбцы:

tradeId, symbol и вновь добавленный rate столбец. Я ищу наиболее эффективный способ объединить эти данные и получить результаты в openTrades DataTable в новом столбце rate.

EDIT

Я пытаюсь этот код:

DBUtil DB = new DBUtil(); 
DataTable rates = DB.GetCurrentFxPrices("http://rates.fxcm.com/RatesXML"); 
DataTable openTrades = DB.GetOpenTrades(); 

openTrades.Columns.Add("Bid", typeof(decimal)); 
openTrades.Columns.Add("Ask", typeof(decimal)); 

var query = from DataRow tradeRow in openTrades.Rows 
      join DataRow rateRow in rates.Rows 
      on tradeRow.Field<string>("symbol") equals rateRow.Field<string>("Symbol") 
      select new 
      { 
       TradeRow = tradeRow, 
       //Bid = rateRow.Field<decimal>("Bid"), 
       //Ask = rateRow.Field<decimal>("Ask") 
       Rate = (rateRow.Field<decimal>("Bid") + rateRow.Field<decimal>("Ask"))/2 
      }; 

foreach (var item in query) 
{ 
    //item.TradeRow["Bid"] = item.Bid; 
    //item.TradeRow["Ask"] = item.Ask; 
    item.TradeRow["lastPrice"] = item.Rate; 
} 

Но я получаю эту ошибку на select:

System.InvalidCastException: Specified cast is not valid.

ответ

1

Вы можете присоединиться к существующим таблицам со следующим запросом, а затем перебрать полученную последовательность, чтобы обновить значения Rate в торговой таблице.

var query = from DataRow tradeRow in openTrades.Rows 
      join DataRow rateRow in rates.Rows 
      on tradeRow.Field<string>("Symbol") equals rateRow.Field<string>("Symbol") 
      select new 
      { 
       TradeRow = tradeRow, 
       Rate = rateRow.Field<decimal>("Rate") // use actual type 
      }; 

foreach (var item in query) 
{ 
    item.TradeRow["Rate"] = item.Rate; 
} 

Ваша openTrades таблица должна отражать изменения, и вы можете продолжать делать любую работу, вам нужно.

+0

Спасибо за ответ. Я изменил ваш код в строке, начиная «Rate» до «Rate = (rateRow.Field (« Bid ») + rateRow.Field (« Спросить »))/2', потому что я хочу, чтобы средняя ставка и цена запроса (нет ставки цены). Затем я изменил позицию item.TradeRow в вашем foreach на 'item.TradeRow [" lastPrice "] = item.Rate;' но я получаю эту ошибку в строке 'select':' System.InvalidCastException {«Указанное приведение недействительно . "}' Я отредактировал свой вопрос с полным кодом, который я использую. –

+1

@Mark, эти столбцы в таблице ставок могут не быть десятичными полями, они могут быть двойными или другим форматом. Попробуйте '' сначала или проверьте тип данных. –

+0

Вот и все! Этот код зафиксировал это: 'Rate = (decimal.Parse (rateRow.Field (« Bid »)) + decimal.Parse (rateRow.Field (« Ask »)))/2'. Спасибо за вашу помощь. –

1

Вы смотрели в использовании Linq для сделай это?

Нечто похожее на следующее должно делать то, что вам нужно. Получающийся анонимный тип может быть загружен в DataTable, если необходимо, или просто привязан непосредственно к элементу управления сеткой.

using (var wc = new System.Net.WebClient()) { 
var openTrades = new [] { 
    new {tradeId="000", symbol="EURUSD"}, 
    new {tradeId="001", symbol="USDJPY"} 
}; 

var resultData = XElement.Parse(wc.DownloadString("http://rates.fxcm.com/RatesXML")) 
    .Elements("Rate") 
    .Select(x=>new { 
     Symbol=x.Attribute("Symbol").Value, 
     Bid=x.Element("Bid").Value, 
     Ask=x.Element("Ask").Value, 
     High=x.Element("High").Value, 
     Low=x.Element("Low").Value, 
     Direction=x.Element("Direction").Value, 
     Last=x.Element("Last").Value 
    }) 
    .ToList() 
    .Join(openTrades, x=>x.Symbol, x=>x.symbol, (rate,trades)=> new {trades.tradeId, rate.Symbol, rate.Ask, rate.Bid, rate.High, rate.Low, rate.Direction, rate.Last}) 
    .ToList();   

}

Чтобы сделать эту работу, вам понадобятся следующие пространства имен ссылки: System.Linq System.Xml.Linq

Успехов!

Смежные вопросы