Вы не используете типизированный DataSet, поэтому мой первый вопрос будет таков: знает ли DataTable, что эти поля должны быть int? во-первых, или они перечислены как строки? Если DataTable обрабатывает эти поля как строки, вы увидите эту ошибку. В следующем коде предполагается набор данных TestData с набором данных Models, с двумя строковыми столбцами, которые могут иметь значение NULL и YearEnd:
using (TestData ds = new TestData())
{
// Typed Rows
ds.Models.AddModelsRow("1", "2");
ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST
// Untyped rows
DataRow r = ds.Models.NewRow();
r[0] = "4";
r[1] = "5";
ds.Models.Rows.Add(r);
//query
var list = from m in ds.Tables["Models"].AsEnumerable()
select new Model
{
// rest of members omitted to simplify
YearBegin = m.Field<int?>("YearBegin"),
YearEnd = m.Field<int?>("YearEnd"),
};
}
В этом коде возникнет исключение InvalidCastException. Однако, когда я переворачиваю типы в DataTable на обнуляемый Int32, почти идентичный код работает правильно:
using (TestData ds = new TestData())
{
// Typed Rows
ds.Models.AddModelsRow(1, 2);
ds.Models.AddModelsRow(ds.Models.NewModelsRow()); // NULL INFO TEST
// Untyped rows
DataRow r = ds.Models.NewRow();
r[0] = 4;
r[1] = 5;
ds.Models.Rows.Add(r);
//query
var list = from m in ds.Tables["Models"].AsEnumerable()
select new Model
{
// rest of members omitted to simplify
YearBegin = m.Field<int?>("YearBegin"),
YearEnd = m.Field<int?>("YearEnd"),
};
}
Посмотрите на свой DataTable. Вы можете исправить свою проблему там. Поле приведено к int? не будет работать, если ваше поле DataTable не совпадает с int? тип.