Как присоединиться к DataTables? - PullRequest
2 голосов
/ 19 января 2011

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

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

Я хочу добавить столбец к openTrades с именем rate и указать текущую скорость соединения rates DataTable со столбцом с именем 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.

Ответы [ 2 ]

1 голос
/ 19 января 2011

Вы можете объединить существующие таблицы с помощью следующего запроса, а затем выполнить итерацию по полученной последовательности, чтобы обновить значения 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 должна отражать изменения, и вы можете продолжать выполнять любую работу, которая вам нужна.

1 голос
/ 19 января 2011

Вы пытались использовать 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

Удачи!

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