私の C# linq クエリに少し問題があり、あなたが助けてくれることを願っています.
私がやりたいのは、データベースから通貨、日付、レートのリストを取得し、レコードを GBP、EUR、または USD に変換し、別のテーブルに変換することです。複数の foreach/ for ループでこれを実行できることはわかっていますが、これらの複数の反復なしで実行したいと考えています。
私は現在、gbpConvertedRates の USD と EUR レート (これは問題ありません)、eurConvertedRates の USD (これにも GBP が必要です)、および usdConvertedRates の EUR と GBP を除く他のすべてのレート (これら 2 つのレートも必要です) を取得します。
これが私のコードです:
foreach (string curr in ConfigTemplate.WantedCurrencies)
{
temp = new DataTable();
cmd = new SqlCommand();
cmd.CommandText = "GetLast5Rates";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter();
param.ParameterName = "@curr";
param.Value = curr;
cmd.Parameters.Add(param);
temp = dbConn.ExecuteQuery(cmd);
MaxDate = DateTime.Parse(temp.Compute("MAX(Date)", string.Empty).ToString());
MinDate = DateTime.Parse(temp.Compute("MIN(Date)", string.Empty).ToString());
OtherDate = MaxDate.AddDays(-1);
//Populate the base rates for EUR, GBP and USD
for (int i = 0; i < temp.Rows.Count; i++)
{
if (curr == "EUR")
{
if (log.IsInfoEnabled) log.Info("Populate EUR DataTable");
row = eurRateDt.NewRow();
row[1] = DateTime.Parse(temp.Rows[i].ItemArray[0].ToString());
row[0] = temp.Rows[i].ItemArray[1].ToString();
row[2] = Convert.ToDecimal(temp.Rows[i].ItemArray[2]);
eurRateDt.Rows.Add(row);
}
if (curr == "GBP")
{
if (log.IsInfoEnabled) log.Info("Populate GBP DataTable");
row = gbpRateDt.NewRow();
row[1] = DateTime.Parse(temp.Rows[i].ItemArray[0].ToString());
row[0] = temp.Rows[i].ItemArray[1].ToString();
row[2] = Convert.ToDecimal(temp.Rows[i].ItemArray[2]);
gbpRateDt.Rows.Add(row);
}
if (curr == "USD")
{
if (log.IsInfoEnabled) log.Info("Populate USD DataTable");
row = usdRateDt.NewRow();
row[1] = DateTime.Parse(temp.Rows[i].ItemArray[0].ToString());
row[0] = temp.Rows[i].ItemArray[1].ToString();
row[2] = Convert.ToDecimal(temp.Rows[i].ItemArray[2]);
usdRateDt.Rows.Add(row);
}
}
//Linq query that converts the rates in the temp table
//to that of the GBP rates
var gbpConversion = from myRow in temp.AsEnumerable()
join gbpRow in gbpRateDt.AsEnumerable()
on myRow["Date"] equals gbpRow["Date"]
where myRow["Currency"].ToString() == "USD"
|| myRow["Currency"].ToString() == "EUR"
select new
{
Currency = myRow["Currency"],
Date = myRow["Date"],
Rate = myRow.Field<Decimal>("Rate") / gbpRow.Field<Decimal>("Rate")
};
var eurConversion = from myRow in temp.AsEnumerable()
join eurRow in eurRateDt.AsEnumerable()
on myRow["Date"] equals eurRow["Date"]
//join gbpRow in gbpRateDt.AsEnumerable() on myRow["Date"] equals gbpRow["Date"]
where myRow["Currency"].ToString() == "GBP"
|| myRow["Currency"].ToString() == "USD"
select new
{
Currency = myRow["Currency"],
Date = myRow["Date"],
Rate = myRow.Field<Decimal>("Rate") / eurRow.Field<Decimal>("Rate")
};
var usdConversion = from myRow in temp.AsEnumerable()
join usdRow in usdRateDt.AsEnumerable()
on myRow["Date"] equals usdRow["Date"]
where myRow["Currency"].ToString() != "USD"
select new
{
Currency = myRow["Currency"],
Date = myRow["Date"],
Rate = myRow.Field<Decimal>("Rate") / usdRow.Field<Decimal>("Rate")
};
usdConvertedRates = usdConversion.CopyToDataTable(usdConvertedRates, LoadOption.PreserveChanges);
gbpConvertedRates = gbpConversion.CopyToDataTable(gbpConvertedRates, LoadOption.PreserveChanges);
eurConvertedRates = eurConversion.CopyToDataTable(eurConvertedRates, LoadOption.PreserveChanges);
}