Указанное приведение недействительно при использовании приведения

Я получаю следующую ошибку при попытке получить сумму в этом запросе Linq:

InvalidCastException не было обработано. Указанный состав недействителен.

Я использовал свойство DataType, чтобы трижды проверить, является ли столбец на самом деле двойным, и это так.

foreach (DataColumn item in _dttMasterViewTransaction.Columns)
{
    if (item.ColumnName == "Dr")
    {
        //Outputs: System.Double!
        MessageBox.Show(item.DataType.ToString());
    }
}

var datos = _dttMasterViewTransaction.AsEnumerable().Where(r => (int)r["Entity"] == FundsID).Select(r => new EntityJESummary()
{
    JEId = (int)r["JE ID"],
    JEGroupingId = (int)r["JE Group"],
    PartnershipId = (int)r["Entity"],
    BookingDate = Convert.ToDateTime(r["GL Date"]),
    EffectiveDate = Convert.ToDateTime(r["Effective Date"]),
    Allocated = Convert.ToBoolean(r["Allocated"]),
    JEEstate = (int)r["JE State"],
    JEComments = r["JE Comments"].ToString(),

    Debit = _dttMasterViewTransaction.AsEnumerable().Where(s => (int)r["Entity"] == FundsID).Sum(s => (double)s["Dr"]),
    Credit = _dttMasterViewTransaction.AsEnumerable().Where(s => (int)r["Entity"] == FundsID).Sum(s => (double)s["CR"])

}).First();

Любые предложения о том, почему это может произойти?


person Only Bolivian Here    schedule 03.08.2011    source источник
comment
Вы случайно не пытаетесь преобразовать строки в ints?   -  person user541686    schedule 03.08.2011


Ответы (3)


Являются ли какие-либо записи нулевыми для этого поля? или есть такие, которые не являются двойниками?

нам нужно увидеть больше данных, чтобы получить лучший ответ...

person John Gardner    schedule 03.08.2011
comment
Кстати, на случай, если кто-то попадет в такую ​​же беду. Я использовал: .Sum(s => (s["Dr"] == DBNull.Value) ? 0 : Convert.ToDouble(s["Dr"])) - person Only Bolivian Here; 03.08.2011
comment
эта штука с DBNull хотя бы раз кусает всех. я не уверен, почему они решили иметь специальное контрольное значение для null вместо того, чтобы просто использовать null.. - person John Gardner; 03.08.2011

Если значения могут быть нулевыми или пустой строкой, попробуйте следующее:

Debit = _dttMasterViewTransaction.AsEnumerable().Where(s => (int)r["Entity"] == FundsID).Sum(s => (String.IsNullOrEmpty(s["Dr"]) ? 0d : (double)s["Dr"])),
Credit = _dttMasterViewTransaction.AsEnumerable().Where(s => (int)r["Entity"] == FundsID).Sum(s => (String.IsNullOrEmpty(s["CR"]) ? 0d : (double)s["CR"]))
person Matten    schedule 03.08.2011

Вы можете использовать Nullable форму Sum.

Debit = _dttMasterViewTransaction.AsEnumerable().Where(s => (int)r["Entity"] == 
FundsID).Sum(s => (double?)s["Dr"]),     
Credit = _dttMasterViewTransaction.AsEnumerable().Where(s => (int)r["Entity"] == 
FundsID).Sum(s => (double?)s["CR"])

Проверьте эту ссылку для более подробной информации:

http://weblogs.asp.net/zeeshanhirani/archive/2008/07/15/applying-aggregates-to-empty-collections-causes-exception-in-linq-to-sql.aspx

person Asdfg    schedule 03.08.2011