Manivannan KG
Manivannan KG

Reputation: 371

unable to cast of type 'System.Data.EnumerableRowCollection`1[System.String]' to type 'System.IConvertible'

I need the column value(FundSpreadDurationContribution) of a data table(residing in dataset) through LINQ which fetches the above error (heading)

Elaborated: when a row cell has value Spread Duration--IR Swap, need the corresponding column cell FundSpreadDurationContribution value.

 double testvalue = Convert.ToDouble(raptorDS.Tables[RaptorTable.DurationContribBySector].AsEnumerable().Where(r =>
                                         r.Field<string>(RaptorColumns.FundCode) == fundDescriptionColumn &&
                                         r.Field<string>(RaptorColumns.Component) == Component.B8_DURATION_CONTRIBUTION_BY_SECTOR &&
                                         r.Field<string>(RaptorColumns.Sector) == "Spread Duration--IR Swap").Select(s => s.Field<string>(RaptorColumns.FundSpreadDurationContribution)))

I am learner of LINQ.

Upvotes: 0

Views: 2093

Answers (3)

Manivannan KG
Manivannan KG

Reputation: 371

This is just playing around with Datatypes which fixed the type casting issue

 var sumFundSpreadDuration = raptorDS.Tables[RaptorTable.DurationContribBySector].AsEnumerable().Where(r =>
                                             r.Field<string>(RaptorColumns.FundCode) == fundDescriptionColumn &&
                                             r.Field<string>(RaptorColumns.Component) == Component.B8_DURATION_CONTRIBUTION_BY_SECTOR &&
                                             r.Field<string>(RaptorColumns.Sector) == "Spread Duration--IR Swap")
                                             .Select(s => s.Field<double?>(RaptorColumns.FundSpreadDurationContribution)).FirstOrDefault();

If you see the datatype of variable is changed to Variant from double. Also, the datatype of column FundSpreadDurationContribution is changed to double. Thanks to CodingYoshi for providing insights of datatypes in linq

Upvotes: 0

CodingYoshi
CodingYoshi

Reputation: 26989

// First check if this query will return any results 
var records =
    raptorDS.Tables[RaptorTable.DurationContribBySector].AsEnumerable().Where(r =>
    r.Field<string>(RaptorColumns.FundCode) == fundDescriptionColumn &&
    r.Field<string>(RaptorColumns.Component) == Component.B8_DURATION_CONTRIBUTION_BY_SECTOR &&
    r.Field<string>(RaptorColumns.Sector) == "Spread Duration--IR Swap");

// CHeck if any result
if (records.Any())
{
    // We have results so let's go through each record and try to get that value
    // converted to a double
    List<double> values = new List<double>();
    List<string> badValues = new List<string>();
    foreach (var thisRecord in records)
    {
        var fsdc = thisRecord.Field<string>(RaptorColumns.FundSpreadDurationContribution);
        if (!string.IsNullOrWhiteSpace(fsdc))
        {
            double val = 0;
            if (double.TryParse(fsdc, val))
            {
                values.Add(val);
            }
            else
            {
                badValues.Add(fsdc);
            }
        }
    }

    // Do whatever you need to do with values here

    // and bad values here
}

Upvotes: 2

D Stanley
D Stanley

Reputation: 152491

Where returns a collection, which cannot be converted to a double. Use one of these Linq methods to get one answer to convert:

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault

Upvotes: 1

Related Questions